我正在开发一个带有开始和停止按钮的应用程序。这些按钮会阻止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需要更长时间只是时间问题,所以我想找到更好的答案。有没有人遇到过这个问题?有没有人对我如何解决它有任何想法?
答案 0 :(得分:2)
尝试使用g_main_context_pending(NULL)
和g_main_context_iteration(NULL,FALSE)
代替gtk_events_pending()
,不推荐使用后者。
这可能是一个时间问题,因为你的循环会在任何事件被注册到主循环之前启动,因此会立即退出 - 但这只是因为缺少代码而疯狂猜测。
中断条件也是错误的,您不希望在特定时间点处理所有事件后立即退出,您希望继续直到长时间运行完成。
这意味着您需要在操作完成时发出信号,在当前使用的循环中检查该标志并使用*_iteration(...)
的阻止模式