Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C gtk_events_pending()返回FALSE,事件仍处于挂起状态_C_Gtk - Fatal编程技术网

C gtk_events_pending()返回FALSE,事件仍处于挂起状态

C gtk_events_pending()返回FALSE,事件仍处于挂起状态,c,gtk,C,Gtk,我正在开发一个有启动和停止按钮的应用程序。这些按钮会阻塞UI,由于各种原因,我无法生成线程 按下这些按钮时,我一直在显示一个工作屏幕,使用: while (gtk_events_pending()) gtk_main_iteration(); 确保在启动/停止操作开始之前加载工作屏幕 我最近升级到了GTK+3.8.6,现在看来GTK\u events\u pending()已经被破坏了。现在,有时窗口会显示,但窗口中的图像不存在。有时甚至连窗户都看不出来 所讨论的函数如下所示: gtk_wid

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

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

while (gtk_events_pending()) gtk_main_iteration();
确保在启动/停止操作开始之前加载工作屏幕

我最近升级到了GTK+3.8.6,现在看来
GTK\u events\u 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();
int busy\u wait=0;
gtk_小部件_显示(工作屏幕);
while(gtk_事件_挂起()|忙|u等待<5)
{
gtk_main_迭代();
如果(!gtk_events_pending())++忙_wait;
}
长时间运行的阻塞函数();

…很好用。然而,我知道这只是一个时间问题,直到繁忙的等待需要更长的时间,所以我想找到一个更好的答案。有人经历过这个问题吗?有人知道我该如何解决这个问题吗?

试试
g\u main\u context\u pending(NULL)
g\u main\u context\u迭代(NULL,FALSE)
而不是
gtk\u events\u pending()
,后者是不推荐的


这可能是一个计时问题(可能是您的循环在任何事件注册到主循环之前启动,因此立即退出)——但由于缺少代码,这只是胡乱猜测


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

请添加更多代码,这不足以调查您的问题。像往常一样,一个最简单的例子是你能做的最好的事情。我尝试将调用切换到
gtk_main_pending()
gtk_main_iteration()
,但是我看到了同样的行为。考虑到我在添加事件之后正在循环,我可以看出这可能是一个时间问题。我不确定等待GTK注册事件的最佳方式是什么由块组成,
使用gtk_main_context_迭代(NULL,FALSE)在这些块之间。如果它真的是一个不可分割的部分,那么就用一个线程(即
GThread
)。在我的代码中添加
gtk_main_iteration()
调用似乎有帮助。@drahnr我找不到任何关于
gtk_events_pending
被弃用的说法。至少它在gtk+3稳定版中没有被弃用。这篇文章已经有3年历史了,smetimes API从抨击中复活了。Tbh,我不知道,你应该自己检查一下,依靠一个3年的帖子。