我达到了一个我甚至无法开始思考如何解决这个问题的地步:
我正在使用Tk表单来请求URL,使用WWW :: Mechanize和Coro线程来获取一些图像,然后使用其他Tk窗口来显示这些图像。
问题是,创建第二个Tk窗口会导致我的应用程序崩溃。
我已将代码缩减为以下内容:
use Coro;
use Coro::LWP;
use EV;
use WWW::Mechanize;
use strict;
use warnings;
my $mech = WWW::Mechanize->new();
my @matches = ();
my @processes = map {fetch_img($_)} (0...200);
my $loop = async { EV::loop };
sub fetch_img {
my ($i) = @_;
return new Coro sub{
print "thread $i\n";
$mech->get($matches[$i]);
};
}
use Tk;
my $topz= MainWindow->new;
Tk::MainLoop;
@matches = ("https://www.google.com/images/srpr/logo4w.png",
"https://www.google.com/images/srpr/logo4w.png",
"https://www.google.com/images/srpr/logo4w.png",
"https://www.google.com/images/srpr/logo4w.png",
"https://www.google.com/images/srpr/logo4w.png");
map {$processes[$_]->ready} (1...(@matches-1));
map {$processes[$_]->join} (1...(@matches-1));
print "you see this\n";
my $top2 = MainWindow->new;
print "you don't see this\n";
Tk::MainLoop;
上面的程序,当保存为“ t.pl ”时,运行没有问题。但是,当保存为例如“ testes.pl ”,它随着第二个MainWindow的创建而消亡。 (对于它的价值,根据我的测试,当名称长度超过5个字符时,它会死掉。但老实说,如果发生这样的随机错误,我认为我在这里使用的是严重错误。)
如何保存这个程序?这里真正的问题是什么?
版本:
Perl v5.16.3 (built for MSWin32-x86-multi-thread)
Coro 6.23
EV 4.15
WWW::Mechanize 1.72