4

锡纸上写着什么。

Qt 5.x 在 Windows 上做得很好(尽管有控制台警告消息),但是在 Linux 中重新绘制时会窒息,如果你把 GUI 事件循环放在主线程。

那么,有什么东西可以可靠地跨 Windows 和 Linux(可能还有 Mac,但这似乎是一个远景)在主线程中处理 not-being-created/not-having-its-event-loop-running 吗?

这里的背景是我有一个我想通过 tclsh 使用的 DLL/SO,我希望那个 DLL/SO 提供一个 GUI。我可以弄乱 SWIG 生成的包装器来获取主解释器并从那里运行一些东西,但是弄乱它似乎是一个主要的麻烦。我已经对 Tk 进行了一些试验,但即使在调用 Tk_Init 之后,Tk_MainWindow 也会NULL在创建的线程中的解释器上返回(解释器也是在该线程中创建的)。按需提供代码。

编辑:代码。load <libname>.so这一切都在通过in加载 DLL/SO 后创建的单独线程中运行tclsh

Tcl_Interp* interp = Tcl_CreateInterp();
Tcl_AppInit(interp); // added on suggestion - all results the same so far
Tk_Init(interp);
/* GDB reveals 'interp->resultDontUse' to be blank here.
  Return value of the above statement is 1 (TCL_ERROR) */
Tk_Window main_window = Tk_MainWindow(interp);
// main_window is NULL here, and thus the following line fails miserably
Tk_Window canvas = Tk_CreateWindow(interp, main_window, "gfx", NULL);
while(true) {
    { ... }
    Tcl_DoOneEvent(TCL_DONT_WAIT);
}
Tcl_DeleteInterp(interp);

注意我仍然可以切换库。如果那里有一个原始问题适用的库,并且上述内容无法正常工作,我会切换。

更新

Tcl/Tk 似乎在非主线程中处理得很好。至少,比Qt好。谢谢!

4

1 回答 1

1

是的,由于这个问题是通过评论回答的,所以我将答案转移到答案中。

是的,Tk GUI 库不在主线程中也可以做得很好。您遇到的问题是您的初始化失败(由于版本不匹配,用您的话来说),并且由于您没有正确检查结果,因此您没有注意到错误。

于 2013-07-31T04:22:03.363 回答