我正在扩展一个 GTK 应用程序,它执行一组需要高 CPU 负载的操作。我想包括通过单击 GUI 中的按钮来停止此操作的可能性。问题在于,正如预期的那样,来自按钮的信号实际上是在操作完成后立即触发的。
现在,代码看起来像这样:
[...]
// code snippet to show the dialog and to enable user interactions with the buttons on the lower side of the window
while(TRUE) {
gint run = gtk_dialog_run (window_main);
if (run == GTK_RESPONSE_APPLY) {
gboolean success = start_long_operation();
}
else if (run == GTK_RESPONSE_HELP) {
open_about();
}
else if (run == GTK_RESPONSE_CANCEL) {
stop_long_operation();
}
else {
gtk_widget_destroy (window_main);
return;
}
}
我已经声明了一个busy_state
由长操作的函数检查的全局变量:如果它是 TRUE,则内部循环继续循环。否则,循环退出并且函数返回结果。
stop_long_operation()
只需将此全局变量设置为 FALSE。
如前所述,在操作完成之前,我无法按下“停止”按钮和“发送”GTK_RESPONSE_CANCEL,因为它阻塞了整个窗口。
我已经尝试在函数while (g_main_context_iteration(NULL, FALSE))
内部使用技巧stop_long_operation()
,如 gtk's docs 中所述,但没有结果。
我真的需要设置多线程功能吗?我可以避免这种情况吗?谢谢您的帮助。