4

ブリキに書かれていること。

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 よりは優れています。ありがとう!

4

1 に答える 1

1

そうです、この質問はコメントで回答されたので、回答を回答に移しています。

はい、Tk GUI ライブラリは、メイン スレッドになくても問題なく実行できます。あなたが抱えていた問題は、(あなたの言葉によると、バージョンの不一致が原因で) 初期化が失敗し、結果を適切にチェックしていなかったため、エラーに気付かなかったことです。

于 2013-07-31T04:22:03.363 に答える