我正在将Win32应用程序移植到C语言中的GTK+应用程序。
UI 向另一个(非 ui)库注册回调。 当库需要用户提供一些额外的信息时,它会调用回调。 UI 提示用户输入,然后在用户输入请求的信息时调用不同的库"setinfo"调用。 UI 无法阻止库的回调,等待用户输入。
在 Windows 中,这是由回调处理的,将自定义消息发布到主窗口并立即返回。 主窗口将显示一个对话框来收集用户输入,并在应用时通过"setinfo"将此信息推送回去。
在GTK中实现此目的的等效或首选机制是什么? 也就是说,如何发布某种自定义消息或事件,导致对话框从 GTK 的主线程中运行并快速返回到回调线程?
所以你有你的UI,和外部库L。我认为正确的解决方案是这样的:
- 在第一个回调中,L 调用 UI 时,您会弹出一个 GtkDialog。
- 您不调用
gtk_dialog_run()
,这将使对话框成为模态,但块 L。 - 当对话框生成响应信号时,您可以解析它并回调到
L.setinfo()
中。 - 关闭对话框。
对我有用的解决方案是 g_idle_add()。
在回调线程中:
g_idle_add(MyPromptFunction, someData);
return;
这将返回到库。然后,主 UI 线程调用 MyPromptFunction,从中我可以显示我的对话框,收集所需的信息,并通过 SetInfo() 将其重新提交到库。