gtk_events_pending()返回FALSE且事件仍处于未决状态

时间:2014-01-21 23:51:03

标签: c gtk

我正在开发一个带有开始和停止按钮的应用程序。这些按钮会阻止UI,由于各种原因,我无法生成线程。

按下这些按钮时,我一直在显示工作屏幕,使用:

while (gtk_events_pending()) gtk_main_iteration();

确保在开始/停止操作开始之前加载工作屏幕。

我最近升级到GTK + 3.8.6,似乎gtk_events_pending()现在已经破了。现在,有时窗口显示,但窗口中的图像不存在。有时候窗户甚至都没有显示出来。

有问题的功能如下:

gtk_widget_show(working_screen);
while (gtk_events_pending()) gtk_main_iteration();

long_running_blocking_function();

如果我这样做:

int busy_wait = 0;
gtk_widget_show(working_screen);
while (gtk_events_pending() || busy_wait < 5) 
{
    gtk_main_iteration();
    if (!gtk_events_pending()) ++busy_wait;
}

long_running_blocking_function();

......它运作正常。但是,我知道busy_wait需要更长时间只是时间问题,所以我想找到更好的答案。有没有人遇到过这个问题?有没有人对我如何解决它有任何想法?

1 个答案:

答案 0 :(得分:2)

尝试使用g_main_context_pending(NULL)g_main_context_iteration(NULL,FALSE)代替gtk_events_pending(),不推荐使用后者。


这可能是一个时间问题,因为你的循环会在任何事件被注册到主循环之前启动,因此会立即退出 - 但这只是因为缺少代码而疯狂猜测。


中断条件也是错误的,您不希望在特定时间点处理所有事件后立即退出,您希望继续直到长时间运行完成。 这意味着您需要在操作完成时发出信号,在当前使用的循环中检查该标志并使用*_iteration(...)的阻止模式