我正在开发一个具有开始和停止按钮的应用程序.这些按钮会阻止UI,由于各种原因,我无法生成线程.
按下这些按钮时,我一直在显示工作屏幕,使用:
while (gtk_events_pending()) gtk_main_iteration();
Run Code Online (Sandbox Code Playgroud)
这确保在开始/停止操作开始之前加载工作屏幕.
我最近升级到GTK + 3.8.6,现在似乎gtk_events_pending()已经破了.现在,有时窗口显示,但窗口中的图像不存在.有时候窗户甚至都没有显示出来.
有问题的功能如下:
gtk_widget_show(working_screen);
while (gtk_events_pending()) gtk_main_iteration();
long_running_blocking_function();
Run Code Online (Sandbox Code Playgroud)
如果我这样做:
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();
Run Code Online (Sandbox Code Playgroud)
......工作正常 但是,我知道busy_wait需要更长时间只是时间问题,所以我想找到更好的答案.有没有人遇到过这个问题?有没有人对我如何解决它有任何想法?
尝试使用g_main_context_pending(NULL)和g_main_context_iteration(NULL,FALSE)代替gtk_events_pending(),后者已被弃用。
这可能是一个计时问题(可能是您的循环在任何事件注册到主循环之前启动,因此立即退出) - 但这只是由于缺乏代码而进行的疯狂猜测。
中断条件也是错误的,您不希望在特定时间点处理完所有事件后立即退出,您希望继续直到长期运行操作完成。这意味着您需要在操作完成时发出信号,检查当前使用的循环中的该标志并使用阻塞模式*_iteration(...)