【发布时间】:2011-04-25 19:51:35
【问题描述】:
我有一个 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?
谢谢
韦斯利
【问题讨论】:
标签: multithreading perl user-interface tkx