2

私は、EXECコマンドを使用してmakeファイルを実行するプログラムに取り組んでいます。これには時間がかかる可能性があるため、GUIがロックされないようにバックグラウンドで配置したいと思います。ただし、GUIを無効にし、makeファイルのコンパイル中にのみプログレスバーを実行することも必要です。

では、TCLでバックグラウンドの進行が終了したことをどのように検出できますか?

編集:上司がコマンドウィンドウを開いたままにする(または表示できるようにする)ことを望んでいるため、ユーザーは作成の進行状況を確認し、エラーが発生するかどうかを確認できるため、さらに複雑になります。

PS糸脱毛を理解するのは簡単でしょうか?GUIがロックするのを防ぐ方法が必要です(応答しないのを防ぎます)。

編集:GUIはTKで作成されています。TKはシングルスレッドであるため、問題が発生すると思います。または、デフォルトでシングルスレッドに設定されていて、マルチスレッドに設定したい場合もあります。

4

2 に答える 2

2

@glenn-jackman が指摘したように、fileevent の使用が推奨されます (どこでも機能するため)。

proc handle_bgexec {callback chan} {
    append ::bgexec_data($chan) [read $chan]
    if {[eof $chan]} {
        # end of file, call the callback
        {*}$callback $::bgexec_data($chan)
        unset ::bgexec_data($chan)
    }
}

proc bgexec {callback args} {
    set chan [open "| $args" r]
    fconfigure $chan -blocking false
    fileevent $chan readable [list handle_bgexec $callback $chan]
    return
}

これを として呼び出しますbgexec job_done cmd /c start /wait cmd /c make all-alljob_done終了後にコマンドの出力で呼び出されます。

このためにスレッドを使用することもできますが、これにはスレッド化された tcl ビルドが必要です (これは現在、すべてのプラットフォームのデフォルトですが、Unix での古いバージョンの Tcl esp はデフォルトでスレッド化された Tcl をビルドしません)。Threadパッケージ (デフォルトで含まれています)。スレッドで使用する方法は次のとおりです。

thread::create "[list exec cmd /c start /wait cmd /c make all-all];[list thread::send [thread::id] {callback code}];thread::exit"

これを定期的に呼び出す必要がある場合は、ジョブごとに新しいワーカー スレッドを作成するのではなく、ワーカー スレッドを 1 つだけ使用する価値があります。

編集: /waitstart のパラメーターとして追加して、最初の cmd を実行し続けます。

cmd /c start /wait cmd /c make all-all
于 2012-08-24T20:46:15.260 に答える