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

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

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

while (gtk_events_pending()) gtk_main_iteration(); 

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

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

有问题的function如下:

 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需要更长时间只是时间问题,所以我想找到一个更好的答案。 有没有人遇到过这个问题? 有没有人对我如何解决它有任何想法?

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


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


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