UIを作成し、ボタンを押した後に長いプロセスを実行するWindows XP上のActiveStates Active Perlのバージョン5.10ビルド1004でPerlスクリプトを実行しています。このプロセス中に、このスレッドの実行中に何が起こっているかについてのステータスで UI (リスト ボックス) を更新したいと思います。これは、コードの簡略化されたバージョンです。
#!/usr/local/bin/perl
use warnings;
use strict;
use Tkx;
use threads;
use threads::shared;
my $outputText = " {a} {b}";
my $mw = Tkx::widget->new(".");
$mw->g_wm_title("MD5 Checker");
$mw->g_wm_minsize(300,200);
my $content = $mw->new_ttk__frame(-padding => "12 12 12 12");
my $btnCompare = $content->new_ttk__button(-text => "Compare", -command => sub{startWork()});
my $lstbxOutput = $content->new_tk__listbox(-listvariable => \$outputText, -height => 5);
my $scollListBox = $content->new_ttk__scrollbar(-orient => 'vertical', -command => [$lstbxOutput, 'yview']);
$lstbxOutput->configure(-yscrollcommand => [$scollListBox, 'set']);
sub startWork()
{
print "Starting thread \n";
my $t = threads->create(\&doWork, 1);
sleep (5);
print $outputText . "\n";
}
sub doWork()
{
for (my $a = 0; $a<10; $a++)
{
$outputText .= " {$a}";
print "Counting $a\n";
sleep(2);
}
print "End thread\n";
}
現在、印刷コマンドはデバッグ用であるため、メインスレッドと子スレッドが何をしているかを知っています。スレッドについて読んだことuse threads::shared;から、スレッドが変数を共有できるようにする必要があります。現時点では、子スレッドの実行中もスレッドが終了したときも、リスト ボックスはまったく更新されません。スレッド化がないと、メイン スレッドがループ処理を実行した後にリスト ボックスが更新されます。スレッドの実行中に UI を更新するには何が欠けていますか?
ありがとう
ウェズリー