2017-06-07 2 views
0

fileeventを使用してファイルをテールしようとしています(Tcl 8.4バージョンのみでなければならないので、chanコマンドを使用できません)。fileeventを使用してローカルファイルをテールします

% 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] 
% 

私は別の端末でcatコマンドを使用してファイルの内容を変更しましたが、それでもGetDataは呼び出さ取得されていません。

gets $fp lineでは、変更されたコンテンツを取得できますが、なぜfileeventがトリガーされないのですか?

答えて

1

fileeventでスケジュールされたコールバックは、イベントループを実行しているときにのみ発生し、tclshはデフォルトでイベントループを実行しません。これを試して私の仮説が正しいかどうかを確認してください:

update 

もしそうであれば、コールバックによって動くようにプログラムを設計する必要があります。イベントループを実行する標準的な方法は次のとおりです。

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

これは、対話型テストではあまり役に立ちません。 (これはTkパッケージをロードする方法の1つで、デフォルトでイベントループの実行をオンにするので、明示的に行う必要はありません。また、ウィンドウを管理するので、影響はありません...)

+0

ありがとうDonal !!!できます。あなたは素晴らしいです!!! – Dinesh

関連する問題