Sleep函数暂停Gtk3主迭代

时间:2016-05-05 11:33:40

标签: 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_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之前发送到主循环的所有事件。

1 个答案:

答案 0 :(得分:3)

你永远不应该在GTK主循环中睡觉,这会冻结它运行的线程。幸运的是,GTK的开发人员意识到人们有时想要延迟一些函数调用,所以他们添加了超时函数Glib::Timeout->add(,它将每隔 n ms调用一个给定的函数,直到函数返回{{ 1}}。

可以在GTK3 Perl tutorial中找到一个示例,用于在GTK主循环运行时每20 ms更新一次Pong游戏。相关行下方:

True