2017-06-07 5 views
0

Ich versuche, eine Datei mit fileevent Schwanz (sollte nur Tcl 8.4 Version, so kann ich nicht verwenden chan Befehl).Tailing eine lokale Datei mit filetevent

% proc GetData {chan} { 
set data [read $chan] 
    puts "[string length $data] $data" 
    if {[eof $chan]} { 
     fileevent $chan readable {} 
    } 
} 
% 
% 
% 
% set fp [open "|tail -f /home/dinesh/input" r+] 
file7 
% fconfigure $fp 
-blocking 1 -buffering full -buffersize 4096 -encoding utf-8 -eofchar {{} {}} -translation {auto lf} 
% fconfigure $fp -blocking 0 -buffering line 
% 
% 
% 
% 
% fileevent $fp readable [list GetData $fp] 
% 

Ich habe den Dateiinhalt mit cat Befehl in einem anderen Terminal geändert, aber noch GetData nicht genannt zu werden.

Mit gets $fp line kann ich die geänderten Inhalte erhalten, aber warum filetevent wird nicht ausgelöst?

Antwort

1

Die mit fileevent geplanten Callbacks treten nur auf, wenn Sie die Ereignisschleife ausführen, und tclsh führt standardmäßig keine Ereignisschleife für Sie aus. Versuchen Sie, dies zu tun, um zu sehen, ob meine Hypothese richtig ist:

update 

Wenn ja, müssen Sie Ihr Programm entwerfen durch Rückrufe angetrieben zu arbeiten. Die Standardmethode zum Ausführen der Ereignisschleife lautet wie folgt:

vwait forever 
# Any global variable name would do, but “forever” has a nice feel 

Aber das ist ein bisschen weniger hilfreich für Ihre interaktiven Tests. (Eine Möglichkeit ist das Laden des Tk-Pakets; das aktiviert die Ereignisschleife standardmäßig, so dass Sie dies nicht explizit tun müssen. Und Sie müssen Fenster verwalten, damit es nicht ohne Folgen bleibt ...)

+0

Danke Donal !!! Es klappt. Du bist toll!!! – Dinesh

Verwandte Themen