我试图将两个代码体集成到同一个进程中,每个进程都有各自的GUI工具包的独立事件循环 - 其中一个使用Xt,另一个使用Qt5 . 目的只是为了能够显示Qt子窗口,而不是像现在已经不存在的Qt / Motif集成扩展那样实现完全集成 .

我已经能够构建一个使用标准Qt事件循环运行的原型原型,使用本机事件过滤器将XCB事件转换为XEvents(使用XESetWireToEvent将其处理程序转换为xEvents / X11有线格式) . 然后使用XtDispatchEvent()将这些XEvent直接调度到Xt . 此时,我可以运行该程序,在同一程序中创建Xt / Motif小部件和Qt小部件,使用菜单,绘制2D图形,并使用Qt和Motif小部件 .

我遇到的问题是,在创建新的Motif对话框时会有很长的延迟 . 我已经将它跟踪到libXt中的_XtWaitForSomething(),最终归结为X服务器连接套接字上的select()或poll() . 由于XtManageChild()内部发生的窗口布局管理,会发生对_XtWaitForSomething()的调用 . _XtWaitForSomething()似乎正在检查事件队列中是否有待处理的事件 .

我有很多问题:

  • 在同一程序中同时使用XCB和libX11调用(使用XCB作为事件队列主控)时,我可以期望来自经典Xlib的调用也能正常工作 - 例如通过libX11调用将事件发布到XCB事件队列,或者确定是否存在是通过旧的libX11调用在XCB事件队列中挂起的任何事件?

  • 为什么XtManageChild()会在libXt中的_XtWaitForSomething()上结束阻塞?看起来它可能正在等待几何变化事件 . 有趣的是,Qt的平台层在一个单独的线程中读取XCB事件,然后在主线程中调度它们 . 我现在想知道在Xt有机会检查事件队列是否包含_XtWaitForSomething()中的任何内容之前,Qt的XCB读取器线程是否正在吃事件,从而导致死锁 . 有什么方法可以在我调用Xt时导致Qt的XCB事件循环[或一般的XCB事件循环]阻塞?我不能只修改Qt在XCB层中有一个条件变量,因为改变Qt不是一个选项 .

#0  0x00000037b30e9a5d in poll () from /lib64/libc.so.6
#1  0x000000355f82d468 in _XtWaitForSomething () from /lib64/libXt.so.6
#2  0x00007ffff77b871f in _XmRootGeometryManager () from /lib64/libXm.so.2
#3  0x000000355f82569f in _XtMakeGeometryRequest () from /lib64/libXt.so.6
#4  0x000000355f8257aa in XtMakeGeometryRequest () from /lib64/libXt.so.6

#5  0x00007ffff77b77e6 in geometry_manager () from /lib64/libXm.so.2
#6  0x000000355f8255f4 in _XtMakeGeometryRequest () from /lib64/libXt.so.6
#6  0x000000355f8255f4 in _XtMakeGeometryRequest () from /lib64/libXt.so.6
#7  0x000000355f8257aa in XtMakeGeometryRequest () from /lib64/libXt.so.6
#8  0x00007ffff773852e in _XmMakeGeometryRequest () from /lib64/libXm.so.2
#9  0x00007ffff770ed51 in change_managed () from /lib64/libXm.so.2
#10 0x000000355f82a2e8 in XtRealizeWidget () from /lib64/libXt.so.6
#11 0x00007ffff771c8d6 in change_managed () from /lib64/libXm.so.2
#12 0x000000355f82c57d in ManageChildren () from /lib64/libXt.so.6
#13 0x000000355f82ca11 in XtManageChildren () from /lib64/libXt.so.6
#14 0x000000355f82cb18 in XtManageChild () from /lib64/libXt.so.6
...
  • XCB中事件队列“所有者”状态到底意味着什么[XSetEventQueueOwner(...,XCBOwnsEventQueue)] . 这是否意味着XLib调用收获事件实际上不会从事件队列的头部“接受”任何事件?

  • 所描述的方法是否存在明显的阻塞问题?我已经知道我可能需要整理计时器(不再调用在事件循环中处理这些的Xt函数),Qt子窗口到motif小部件的窗口父级,...

谢谢 .