首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >休眠函数暂停Gtk3主迭代

休眠函数暂停Gtk3主迭代
EN

Stack Overflow用户
提问于 2016-05-05 19:33:40
回答 1查看 390关注 0票数 1

我有这样的代码:

代码语言:javascript
复制
#! /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之前评估发送到主循环的所有事件。

EN

回答 1

Stack Overflow用户

发布于 2016-05-05 21:08:41

永远不要在GTK主循环中休眠,这会冻结正在运行的线程。幸运的是,GTK的开发人员意识到,人们有时希望延迟某些函数的调用,因此他们添加了超时函数Glib::Timeout->add(,该函数将每隔n毫秒调用一次给定函数,直到函数返回True

可以在GTK3 Perl tutorial中找到一个示例,它用于在GTK主循环运行时每20ms更新一次他们的乒乓球游戏。在相关的行下面:

代码语言:javascript
复制
Glib::Timeout->add( 20, \&update );
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37049540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档