我有一个 Perl 脚本在 Windows xp 上的 ActiveStates Active Perl 版本 5.10 build 1004 上运行,它创建一个 UI,然后在按下按钮后运行一个很长的过程。在这个过程中,我想用这个线程执行期间发生的事情的状态来更新 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 更新我缺少什么?
谢谢
卫斯理