我有这段代码:
#! /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();};
应强制Gtk3评估在调用sleep 4
之前发送到主循环的所有事件。
答案 0 :(得分:3)
你永远不应该在GTK主循环中睡觉,这会冻结它运行的线程。幸运的是,GTK的开发人员意识到人们有时想要延迟一些函数调用,所以他们添加了超时函数Glib::Timeout->add(
,它将每隔 n ms调用一个给定的函数,直到函数返回{{ 1}}。
可以在GTK3 Perl tutorial中找到一个示例,用于在GTK主循环运行时每20 ms更新一次Pong游戏。相关行下方:
True