【问题标题】:GTK equivalent of Win32 PostMessage()GTK 等效于 Win32 PostMessage()
【发布时间】:2012-06-27 22:07:27
【问题描述】:

我正在将一个 Win32 应用程序移植到 C 语言的 GTK+ 应用程序。

UI 向另一个(非 UI)库注册回调。当库需要用户提供一些额外的信息时,它会调用回调。 UI 提示用户输入,然后在用户输入请求的信息时调用不同的库“setinfo”调用。 UI 无法阻止库的回调等待用户输入。

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

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

【问题讨论】:

    标签: gtk gtk3


    【解决方案1】:

    所以你有你的 UI 和外部库 L。我认为正确的解决方案是这样的:

    1. 在第一个回调中,L 正在调用 UI,您会弹出一个 GtkDialog。
    2. 您不调用gtk_dialog_run(),这会使对话框变为模态但会阻塞L。
    3. 当对话框生成响应信号时,您对其进行解析并回调到L.setinfo()
    4. 您关闭对话框。

    【讨论】:

    • 应该这样工作吗?如果我从库回调线程的上下文中创建对话框,当我调用 gtk_widget_show_all(dlg) 时会出现以下崩溃:“xcb_io.c:140: dequeue_pending_request: Assertion `req == dpy->xcb->pending_requests'失败的。”如果我在其他内容的上下文中调用此对话框创建(例如,单击菜单),它可以正常工作。
    【解决方案2】:

    对我有用的解决方案是g_idle_add()

    在回调线程中:

    g_idle_add(MyPromptFunction, someData);
    return;
    

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

    【讨论】:

      猜你喜欢
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多