Qt 集成XCB和libX11事件循环-挂起Xt内的select/poll

Qt 集成XCB和libX11事件循环-挂起Xt内的select/poll,qt,events,x11,xcb,motif,Qt,Events,X11,Xcb,Motif,我试图将两个代码体集成到同一个过程中,每个过程之前都有各自GUI工具包的独立事件循环——一个使用Xt,另一个使用Qt5。其目的只是为了能够显示Qt子窗口,而不是像现在已经失效的Qt/Motif集成扩展那样实现完全集成 我已经能够构建一个使用标准Qt事件循环运行的粗糙原型,使用一个本机事件过滤器将XCB事件转换为XEvents(使用XESetWireToEvent+其处理程序从XEvents/X11 wire格式转换)。然后使用XtDispatchEvent()将这些XEvent直接分派到Xt。此

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

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

我遇到的问题是,在创建新的主题对话框时会有很长的延迟。我已经追踪到libXt中的XtWaitForSomething(),这最终归结为X服务器连接套接字上的select()或poll()。调用XtWaitForSomething()是在XtManageChild()内进行窗口布局管理的结果_XtWaitForSomething()似乎正在检查事件队列中是否有挂起的事件

我有几个问题:

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

  • 为什么XtManageChild()最终会阻塞libXt中的XtWaitForSomething()? 看起来它可能正在等待几何体更改事件。 有趣的是,Qt的平台层在一个单独的线程中读取XCB事件,然后在主线程中调度它们。现在我想知道Qt的XCB读取器线程是否在Xt有机会检查事件队列中是否包含导致死锁的东西之前吃掉了事件。 在我调用Xt时,有没有办法导致Qt的XCB事件循环[或一般XCB事件循环]阻塞?我不能仅仅修改Qt使其在XCB层中具有条件变量,因为更改Qt不是一个选项

  • XCB中的事件队列“所有者”状态究竟意味着什么[XSetEventQueueOwner(…,XCBOwnsEventQueue)]。这是否意味着XLib调用收获事件实际上不会从事件队列的头部“获取”任何事件

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

  • 谢谢

    #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
    ...