相当于Win32 PostMessage()的GTK

相当于Win32 PostMessage()的GTK,gtk,gtk3,Gtk,Gtk3,我正在将Win32应用程序移植到C中的GTK+应用程序 UI向另一个(非UI)库注册回调。库在需要用户提供一些附加信息时调用回调。用户界面提示用户输入,然后在用户输入请求的信息后调用另一个库“setinfo”调用。UI无法阻止等待用户输入的库回调 在Windows中,这是通过回调将自定义消息发布到主窗口并立即返回来处理的。主窗口将显示一个对话框来收集用户输入,应用时将通过“setinfo”将此信息向下推 在GTK中实现这一点的等效或首选机制是什么?也就是说,如何发布某种自定义消息或事件,从而导致

我正在将Win32应用程序移植到C中的GTK+应用程序

UI向另一个(非UI)库注册回调。库在需要用户提供一些附加信息时调用回调。用户界面提示用户输入,然后在用户输入请求的信息后调用另一个库“setinfo”调用。UI无法阻止等待用户输入的库回调

在Windows中,这是通过回调将自定义消息发布到主窗口并立即返回来处理的。主窗口将显示一个对话框来收集用户输入,应用时将通过“setinfo”将此信息向下推


在GTK中实现这一点的等效或首选机制是什么?也就是说,如何发布某种自定义消息或事件,从而导致一个对话框从GTK的主线程中运行并快速返回回调线程?

因此,您有了UI和外部库L。我认为正确的解决方案如下:

  • 在第一个回调中,L调用UI,您会弹出一个GtkDialog
  • 您不需要调用
    gtk\u dialog\u run()
    ,这会使对话框处于模态,但会阻塞L
  • 当对话框生成响应信号时,您将对其进行解析并回调到
    L.setinfo()
  • 关闭对话框

  • 对我有效的解决方案是

    在回调线程中:

    g_idle_add(MyPromptFunction, someData);
    return;
    

    这将返回到库。然后,主ui线程调用MyPromptFunction,从中我可以显示我的对话框,收集所需信息,并通过SetInfo()将其重新提交到库中。

    这是否可行?如果我在库回调线程的上下文中创建对话框,当我调用gtk_widget_show_all(dlg)时,我会遇到以下崩溃:“xcb_io.c:140:dequeue_pending_request:Assertion`req==dpy->xcb->pending_requests”失败。如果我在其他内容(例如,单击菜单)的上下文中调用此对话框创建,它工作正常。