У меня есть скрипт Perl, работающий на версии 5.10, сборка 1004 ActiveStates Active Perl на Windows XP, которая создает пользовательский интерфейс, а затем выполняет длинный процесс после нажатия кнопки. Во время этого процесса я хотел бы обновить пользовательский интерфейс (список) со статусом того, что происходит во время выполнения этого потока. Вот урезанная версия кода.
#!/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;
, чтобы позволить потокам совместно использовать переменные. В настоящий момент мой список не обновляется ни во время выполнения дочерних потоков, ни после завершения потока. Без создания потока список будет обновляться после того, как основной поток завершит цикл. Чего мне не хватает, чтобы пользовательский интерфейс обновлялся во время выполнения потоков?
Спасибо
Wesley