【问题标题】:Perl - Scalars leaking with Win32::GUI and threadsPerl - Win32::GUI 和线程泄漏的标量
【发布时间】:2012-12-31 07:30:51
【问题描述】:

我只是将 Win32-GUI 与线程 (Perl 5.16) 结合使用,但遇到了一些我不太了解的警告和错误。

代码如下:

    use strict;
    use warnings;
    use Win32::GUI();
    use threads;

    my $main = Win32::GUI::Window->new(
        -name => 'main',
        -title => 'Multithreaded Test',
        -size => [300,100],
    );
    my $button1 = $main->AddButton(
        -name => 'button1',
        -text => 'Click me',
        -pos => [10,10],
        -width => 120,
    );
    sub button1_Click {
        my $thread1 = threads->create(\&do_something);
        $thread1->join();
    }
    sub do_something {
        sleep(1);
    }
    $main->Center();
    $main->Show();
    Win32::GUI::Dialog();

当我单击按钮并在 1 秒后加入线程时,我得到以下控制台输出:

在 C:/Perl/site/lib/Win32/GUI.pm 第 3480 行中释放到错误池 35bcd90 而不是 2a1718 在全球毁灭期间。 在 C:/Perl/site/lib/Win32/GUI.pm 第 3480 行免费到错误池 35bcd90 而不是 2a1718 在全球毁灭期间。 标量泄露:1

我发现了几个关于这个“标量泄露”问题的主题,但遗憾的是没有一个有效的解决方案。

你有什么想法吗?

谢谢,

最大。

【问题讨论】:

  • 有趣,我刚刚粘贴了您的代码并强制安装了 Win32::GUI。我没有得到这些错误。我是 Windows XP 上的 Perl v5.16.2。
  • 你不能这样做。 Win32::GUI 不是线程安全的。你想做的事情可能有一个工作:我建议你用谷歌搜索Win32::GUI threads
  • 好的,谢谢。在这种情况下,有什么替代方案?当我点击一个按钮时,我想在后台做一些事情,但同时 GUI 应该是可控的。使用 WxWidgets 会更好吗?

标签: multithreading perl win32gui scalar


【解决方案1】:

这可能不是问题,但您需要为您的main 窗口提供一个Terminate 处理程序,以停止主消息循环。像这样

sub main_Terminate { -1 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-21
    • 2012-10-11
    • 2020-04-06
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    相关资源
    最近更新 更多