2017-10-26 1 views
0

TkCon GUIで機能の実行を途中で止めたい。たとえば、私はTkCon GUI上でコマンドとプロシージャを実行していますが、その場で停止させたい場合はどうしたらいいですか? linuxコンソールでは、 "ctrl + C"を使用します。それはTkConのGUIでは動作しません。tcl tkcon GUIで関数の実行を停止するにはどうしたらいいですか?

+0

一般的なシェルでは、通常、実行中のコードはシェルとは別のプロセスで実行されるため、シェルを煩わせることなく割り込みが発生しやすくなります。 Tkcon *は他のプロセスでコードを開始することを許可しますが、通常は同じプロセスで実行します。 –

+0

Ctrl + CはGUIで「コピー」することがよくあります... –

答えて

0

通常、できません。問題は、実行しているコードがGUIを実行しているコードと同じスレッドにあるため、プログラムが停止するように応答しないことです。 (またはCtrl + Cは、多くの場合、コピー・ツー・クリップボードとして、他の目的に使用される。)

しかし、あなたは別のスレッドでプログラムを実行し、そのスレッドへのハンドルを保持している場合、 cancel the execution(あなたはTcl 8.6を持っていると仮定します)。それは最も単純な形式だでは、この操作を行います。コードcatchが強制取得し、エラーをESまで実行をほどくます

thread::cancel $threadID 

を(コードが外部IOコールのようなもので停止されていないと仮定すると。 )catchのネストがループを再起動している場合は、-unwindオプションも指定する必要があります。巻き戻すと、スレッドは明確に定義された状態に戻ります。

thread::cancel -unwind $threadID 

TkCon GUIは、デフォルトでは、あなたのためにこの機能を提供していません。このを利用しての最も簡単な方法は、このような小さなマスター実行コンテキスト内でコードを実行することです:

package require Thread 

set app_runner [thread::create { thread::wait }] 
proc app_eval {args} { 
    global app_runner 
    thread::send -async $app_runner [concat {*}$args] app_result 
} 
# Simple receiver for async returns 
trace add variable app_result write {apply {args { 
    global app_result 
    if {$app_result ne ""} { 
     puts $app_result 
    } 
}}} 
proc app_cancel {} { 
    global app_runner 
    thread::cancel $app_runner 
} 
# Bring the stack trace locally 
proc app_handle_error {- info} { 
    puts stderr $info 
} 
thread::errorproc app_handle_error 

また、バックグラウンドのエラーハンドラを設定する必要があるかもしれません。

私は上記をテストしてみた:

app_eval { 
    while 1 {puts -nonewline .;after 100} 
} 
app_cancel 

、それがうまく働きました。これらの操作をGUIにバインドすることは、練習問題として残されています。

関連する問題