Version: 2.9.4
マルチスレッドの概要

クラス: wxThread, wxThreadHelper, wxMutex, wxCriticalSection, wxCondition, wxSemaphore

マルチスレッドをいつ使用するべきか

wxWidgets はマルチスレッド (MT) プログラムで必要となるオブジェクトをカプセル化したクラスの一式を提供しています: wxThread クラス自身と、他の同期オブジェクトであるミューテックス (wxMutex 参照)、クリティカルセクション(wxCriticalSection 参照)、コンディション (wxCondition 参照) が含まれます。いくつかの関数の名前が異なりますし、Win32 スレッド API にインスピレーションを受けた機能もありますが、wxWidgets のスレッド API は (pthread としても知られる) POSIX1.c のスレッド API によく似ています。

これらのクラスによって、おそらくマルチスレッドプログラムの作成がより簡単になる上に、(ネイティブ (Win32 または Posix) スレッド API と比較して) いくつかの追加エラーチェックを行なってくれます。ただし、依然としてこれは簡単な仕事ではありませんし、巨大プロジェクトでは特にそうだと思います。マルチスレッドアプリケーションの開発を始める前に (もしくは既存のアプリケーションにマルチスレッド機能を追加する前に)、同じ機能を実装するためのより簡単で安全な方法がないか自問するだけの価値はあります。もちろん、いくつかの状況ではスレッドは本当に意味がありますが (古典的な例ではサーバアプリケーションでクライアントごとに新しいスレッドを実行することが挙げられます)、それ以外の場合ではやり過ぎでしょう。一方で、近年のハードウェアの進歩はマルチコアシステムに関する重要な動向を見せており、マルチコアシステムではマルチスレッドをより有効活用できます。(例えば、長時間の計算を CPU 数と同じ数のスレッドに分割したいと思うかもしれません; wxThread::GetCPUCount を参照してください)

マルチスレッドを使用 せずに ノンブロッキング処理を行なうにはふたつの選択肢があります:

マルチスレッドアプリケーションにおける注意事項

マルチスレッドアプリケーションを作成するときには サブスレッドから GUI 関数を呼び出さない ことを強く推奨します。ひとつの GUI スレッドと複数のワーカースレッドを使用し、イベント を使用してメインスレッドと通信するデザインはよりロバストで、無数の問題が起こるのを間違いなく防いでくれます。(例: Win32 では自スレッドで作成した GDI オブジェクト (ペンやブラシなど) にだけアクセスでき、他スレッドで作成したオブジェクトにはアクセスできません)

メインスレッドとサブスレッドとの通信には wxEvtHandler::QueueEvent か、もしくはその短縮版である wxQueueEvent を使用します。これらの関数はスレッドセーフに実装されているため、あるスレッドから他のスレッドへイベントを送信するのに使用できます。しかし、ワーカースレッドへメッセージを送信するためのビルトイン関数は存在しないため、要件にあった解決方法を実装するために既存の同期オブジェクトを使用する必要があります。特に、メッセージを送信するために wxThread クラスと wxEvtHandler を継承するだけでは不十分なことに注意してください: 実際のところ、これはまったく動作しません。代わりに wxThreadHelper を使用することが奨励されており、このクラスはスレッド間のやり取りとリソースの共有を非常に単純化してくれます。

また、サブスレッドとその削除に関する注意事項について wxThread のドキュメントも参照してください。

最後に、wxEventLoopBase::YieldFor() が直接または (例えば wxProgressDialog で) 間接的に使用される場合、再入可能性の問題とイベントが順不同に処理されることによる問題の両方が発生することを覚えておいてください。. 最後の問題を解決するために wxThreadEvent を使用することができます: wxThreadEvent::GetEventCategory 関数の実装のおかげで wxEVT_CATEGORY_THREAD フラグを指定しない限り、実際には wxEventLoopBase::YieldFor()wxThreadEvent クラスが処理されることはありません。

メインスレッドとサブスレッド間の単純なやり取りの例として スレッドサンプル も参照してください。

 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Defines