0

私は C++ FLTK アプリケーションに取り組んでいます。これは、以下のコードを使用してスレッド内にモーダル ウィンドウを作成および表示するマルチスレッド アプリケーションです。

Fl_Double_Window* dlg = new Fl_Double_Window(0, 0, 200, 100);
...
dlg->set_modal();
Fl::visual(FL_DOUBLE|FL_INDEX);
dlg->show();

次に、同じスレッドで新しいスレッドを作成し、Fl_Double_Windowオブジェクトへのポインターをスレッドパラメーターとして渡します。

CreateThread(
        NULL,                   // default security attributes
        0,                      // use default stack size  
        &beginProgress,     // thread function name
        (LPVOID) dlg,       // argument to thread function 
        0,                      // use default creation flags 
        NULL);

&私のスレッド関数では、いくつかの操作を行います&その後、表示中のモーダルウィンドウを非表示にする必要があります:

DWORD WINAPI beginProgress(LPVOID args)
{
    //do some operations
    ((Fl_Double_Window*)args)->hide();
    return 0;
}

ここでの問題は、私のコードがエラーなしで正常に実行されることですが、オブジェクト ポインターhideのメソッドを実行した後dlg、ウィンドウは非表示にならず、使用してウィンドウ オブジェクトを呼び出しhideたり削除したりしdelete dlgても効果がありません。
この問題はマルチスレッドの動作に関連していると思いますが、問題の原因と解決方法を推測できません。

4

1 に答える 1

0

マルチスレッドに関する FLTK ガイドをお読みください。

FLTK は複数のプラットフォームをサポートします。そのうちのいくつかは、メイン スレッド以外はシステム イベントを処理したり、ウィンドウを開いたり閉じたりすることを許可しません。安全な方法は、すべてのオペレーティング システムのスレッドに対して次の規則に従うことです。

  • ダイアログ、ファイルチューザー、サブウィンドウ、show()またはhide()Fl_GL_Windows

バックグラウンド スレッドからの GUI 更新を処理する FLTK 推奨の方法は次のとおりです。

唯一の回避策は、実行したいことを静的変数に格納し、 を呼び出し fltk::awake()、メイン スレッドをfltk::wait()繰り返し呼び出して、各呼び出しの後に静的値をチェックして処理することです。

于 2013-06-10T17:37:25.183 に答える