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

Chr*_*ris 5 c gtk

我正在开发一个具有开始和停止按钮的应用程序.这些按钮会阻止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需要更长时间只是时间问题,所以我想找到更好的答案.有没有人遇到过这个问题?有没有人对我如何解决它有任何想法?

dra*_*hnr 2

尝试使用g_main_context_pending(NULL)g_main_context_iteration(NULL,FALSE)代替gtk_events_pending(),后者已被弃用。


这可能是一个计时问题(可能是您的循环在任何事件注册到主循环之前启动,因此立即退出) - 但这只是由于缺乏代码而进行的疯狂猜测。


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