我有这样的代码:
#! /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();我预计它会显示第一个标签‘to’,然后休眠4秒钟,然后将标签更改为'OK‘。然而,我得到的是这样的:它显示黑色窗口,然后休眠4秒,然后显示标签'OK‘。
为什么看起来sleep会阻止Gtk3处理所有事件?
这一行while (Gtk3::events_pending()) {Gtk3::main_iteration();};应该强制Gtk3在调用sleep 4之前评估发送到主循环的所有事件。
发布于 2016-05-05 21:08:41
永远不要在GTK主循环中休眠,这会冻结正在运行的线程。幸运的是,GTK的开发人员意识到,人们有时希望延迟某些函数的调用,因此他们添加了超时函数Glib::Timeout->add(,该函数将每隔n毫秒调用一次给定函数,直到函数返回True。
可以在GTK3 Perl tutorial中找到一个示例,它用于在GTK主循环运行时每20ms更新一次他们的乒乓球游戏。在相关的行下面:
Glib::Timeout->add( 20, \&update );https://stackoverflow.com/questions/37049540
复制相似问题