Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 睡眠函数暂停Gtk3主迭代_Perl_Event Handling_Sleep_Gtk3 - Fatal编程技术网

Perl 睡眠函数暂停Gtk3主迭代

Perl 睡眠函数暂停Gtk3主迭代,perl,event-handling,sleep,gtk3,Perl,Event Handling,Sleep,Gtk3,我有以下代码: #! /usr/bin/perl -w use strict; use warnings; use Gtk3 '-init'; my $error_window = Gtk3::Window->new('toplevel'); my $er_label = Gtk3::Label->new('NOPE'); $error_window->add($er_label); $er_label->show(); $error_window->set_siz

我有以下代码:

#! /usr/bin/perl -w
use strict;
use warnings;
use Gtk3 '-init';
my $error_window = Gtk3::Window->new('toplevel');
my $er_label = Gtk3::Label->new('NOPE');
$error_window->add($er_label);
$er_label->show();
$error_window->set_size_request(800,300);
$error_window->set_position('center-always');
$error_window->show_all();
while ($er_label->get_text() eq 'NOPE') {
   while (Gtk3::events_pending()) {Gtk3::main_iteration();};
   sleep 4;
   $er_label->set_text('OK');
}
$error_window->signal_connect('key_press_event', sub { Gtk3::main_quit(); });
Gtk3::main();
这很简单,但表现出奇怪的行为。我希望它显示第一个标签“NOPE”,然后休眠4秒钟,然后将标签更改为“OK”。然而,我得到的是:它显示黑色窗口,然后睡眠4秒钟,然后显示标签“OK”

为什么
sleep
会阻止Gtk3处理所有事件


此行
while(Gtk3::events_pending()){Gtk3::main_iteration();}睡眠4
之前,code>应强制Gtk3评估发送到主循环的所有事件。

您不应在GTK主循环中睡眠,这将冻结运行它的线程。幸运的是,GTK的开发人员意识到人们有时想要延迟一些函数调用,因此他们添加了超时函数
Glib::timeout->add(
),它将每隔n毫秒调用一个给定函数,直到函数返回
True

可以在中找到一个示例,在GTK主循环运行时,它用于每20毫秒更新一次乒乓球游戏。相关行下方:

Glib::Timeout->add( 20, \&update );

也许有个问题?可能是你的问题。最后唯一正确的方法就是睡觉(或者其他任何占位符)但是在一个单独的线程中。标签的更新必须在主线程中完成,但是有一些方法可以在主线程空闲时将函数分派给要调用的主线程,您应该能够通过一些搜索找到如何做到这一点。