WWW :: Mechanize + Coro / EV + Tk =程序随机死亡

时间:2013-04-14 21:07:03

标签: perl tk www-mechanize

我达到了一个我甚至无法开始思考如何解决这个问题的地步:

我正在使用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

0 个答案:

没有答案