2009-06-28 8 views
1

私はboost :: threadと一緒にwxwidgetsを使用しています。スレッドは、GUIにいくつかのイベントを送信ワーカースレッドです:boost :: threadでクラッシュする

スレッドの作成:

thrd = boost::thread(boost::bind(workerFunction,this)); 

GUIにメッセージを送信します。Windowsの下で

wxPostEvent(loWindow, event); 
wxSafeYield(); 

を私は何の問題も表示されませんLinux(Ubuntu 8.10)でアプリケーションを起動すると、次のエラーメッセージで停止します。

私は何が欠けていますか? workerFunctionがスレッドで開始されない場合、問題なく動作します。

よろしく、 /mspoerr

答えて

0

私が送信したデータに問題がありました。複雑なデータの場合、カスタムイベントを使用する必要がありました。私は今カスタムイベントを実装しています。

詳細についてはhttp://forums.wxwidgets.org/viewtopic.php?t=24663

はあなたの助けをありがとう参照してください!

/mspoerr

EDIT:がリンクを更新しました。古いものは壊れていた

+0

はい、あなたが掲示したコードでは、クラッシュの理由は明らかです:) –

+0

あなたの言葉に感謝;) – mspoerr

+0

あなたのリンクが壊れています。 :( – ryanrhee

4

は、ワーカースレッドからwxYieldを呼び出さないでください。 GUIスレッドからのみ行います。 Yieldはguiイベントを処理します.GUIイベントハンドラでは、多くの作業を行い、他のコントロールを更新し、それらの間に保留イベントを処理したい場合に使用されます。 SafewxSafeYieldで、保留中のイベントを処理する前にGUIコントロールを無効にすることを意味します。これは、wxYieldというイベントハンドラを再帰的に入力するような場合から保護します。スレッドセーフであるということではありません。

スレッドの残りの部分に他のスレッドを持たせたい場合は、wxのwxThread::Yieldまたはブーストのthis_thread::yield(スレッドのクラスに応じて)を呼び出します。

+0

あなたの答えをありがとう、しかしwxWidgets docuはこう言っています: "これは、時間のかかるプロセスがテキストに書き込む時々の収量がなければ、テキストウィンドウは適切に更新されず、Windows 3.1などの協調マルチタスキングシステムでは、他のプロセスは応答しません。 私の意見では、これは私が必要なものです。この機能を使用しないと、Windowsアプリケーションもクラッシュします。 /mspoerr – mspoerr

+0

引用しているドキュメントは、シングルスレッドアプリケーションに関するものです。バックグラウンドスレッドで実行する場合は、Sleep(0)(windows.hで定義)やboost equiliventなどのオペレーティングシステム関数を使用します。 –

+0

とこれを実装するための推奨される方法は何ですか? – mspoerr

関連する問題