ブリキに書かれていること。
Qt 5.x は Windows では正常に動作しますが (コンソールの警告メッセージにもかかわらず)、Linux での再描画で窒息し、Cocoa に基づくもの (私は一度も使用したことがありません) は、GUI イベント ループをメインスレッド。
それで、WindowsとLinux(そしておそらくMac、しかしそれはロングショットのようです)でメインスレッドで実行されている作成されていない/イベントループを持っていないことを確実に処理できるものはありますか?
ここでの背景は、tclsh 経由で使用したい DLL/SO があり、その DLL/SO で GUI を提供したいということです。SWIG で生成されたラッパーをいじって、メインのインタープリターを取得し、そこから実行する何かを取得することはできますが、それをいじるのは大変な手間のように思えます。私は Tk で少し実験しましたが、Tk_Init を呼び出した後でも、Tk_MainWindow はNULL
作成されたスレッドのインタープリターに戻ります (インタープリターもそのスレッドで作成されました)。オンデマンドでのコード提供。
編集: コード。これはすべて、DLL/SOload <libname>.so
が inを介してロードされた後に作成された別のスレッドで実行されます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);
NBライブラリを切り替えても大丈夫です。元の質問が機能し、上記が機能しないライブラリがそこにある場合は、切り替えます。
アップデート
Tcl/Tk は、非メイン スレッドにあることを問題なく処理しているようです。少なくとも、Qt よりは優れています。ありがとう!