【问题标题】:perl tk - how to keep GUI alive when procedure inside perl module is being executedperl tk - 在执行 perl 模块内的过程时如何使 GUI 保持活动状态
【发布时间】:2013-10-17 10:39:08
【问题描述】:

我有一个 perl tk 例程从一个导入的 perl 模块调用一个过程。 GUI 在执行子例程时挂起。这是我正在使用的代码摘录。有人可以建议一种更好的方法来执行此操作,以便在程序运行时 GUI 处于活动状态?

use Tk;
use package1;


$mw = MainWindow->new;
$mw->geometry("+10+10");
$mw->title("My notebook GUI");
my $mwFrame = $mw->Frame(-borderwidth => 2, -relief => 'ridge')->pack(-fill=> 'none',-fil=> 'x');
my $nb = $mwFrame->NoteBook(-dynamicgeometry => 'true',-ipadx => 20, -ipady => 20)->pack(-expand => 1,-fill => 'both');             
$page1 = $nb->add( 'Page1',     -label => 'Page 1' );
$page2 = $nb->add( 'Page2',     -label => 'Page 2' );
    $page1->pack();
    $page2->pack();

    $button1 = $page1->Button(-text => "Not Selected", -background => 'gray', -state => 'disabled')->pack(-side => 'right', -expand => 0);
    $button2 = $page2->Button(-text => "Not Selected", -background => 'gray', -state => 'disabled')->pack(-side => 'right', -expand => 0);

    my $obj = package1->new();
    my $obj->run();

在上面的代码中,我从 package1 中调用 run 过程来执行。虽然该过程需要一段时间,但 GUI 冻结,不允许我对其执行任何操作。我什至不能在笔记本 GUI 中从一页转到另一页。

有人可以指导我吗?我是 perl 新手。

谢谢。

【问题讨论】:

  • 你能把$mw->update;(或者不那么流行的$mw->idletasks;)塞进你的$obj里吗? Perlmonks 的这篇文章更好地解释了它perlmonks.org/?node_id=574002
  • 我可以试试 $mw->update;在调用子例程后从我的主代码中。但它只在从程序返回后更新主窗口。另一种方法是能够从过程本身执行“$mw->update”。现在我将如何做到这一点?

标签: perl tk perltk


【解决方案1】:

欢迎来到并发编程的世界。一般来说,这里有三种主要方法:

  1. 线程
  2. 叉/管
  3. 协同多任务/事件循环

各有优缺点。

这是使用线程方法的one example;我认为这可能对您有用。

【讨论】:

    【解决方案2】:

    除了一些基本的东西外,我自己对 tk 并不太精通,但你为什么要在那个地方运行那个 Sub?通常我会假设您希望某些按钮或其他 UI 元素使用某种-command => {$obj->run()} 来启动子例程。 然而,应该始终有效的是从您的主程序中分叉执行。但是如果不知道 run()$obj 做了什么,很难说让它们与主循环并行运行是否可行。

    【讨论】:

    • 不。我实际上在单击按钮时运行了子程序。为了简单起见,我没有在此处包含代码摘录。但是,即使只是调用一个过程也会挂起 GUI,而不管 GUI 是否正在调用它。+
    • edit:冻结是指流程的 UI 没有响应?我以为你的意思是它完全冻结了你的电脑。 UI 没有响应是因为您的进程正忙于处理子程序,阻止它处理其他任何事情甚至更新 UI。如果您希望您的 Ui 保持可用,您必须使用 Mikko 建议的任何一种方法自己管理并发。我个人建议分叉,因为它是最简单的方法(恕我直言),如果您想通过手动管理线程来提高性能,那么您一开始就不应该使用 Perl。
    猜你喜欢
    • 2012-10-18
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多