ホームページ  >  記事  >  スレッド間の通信のいくつかの方法

スレッド間の通信のいくつかの方法

hzc
hzcオリジナル
2020-07-01 14:00:1217154ブラウズ

スレッド間通信の方法には次のものが含まれます: 1. グローバル変数、共通の通信方法および対話方法であるプロセス内のスレッド間のメモリ共有、2. メッセージ メッセージ メカニズム、3. CEvent オブジェクト、CEvent はMFC のオブジェクトは、CEvent のトリガー ステータスを変更することでスレッド間の通信を実現できます。

スレッド間の通信のいくつかの方法

#マルチスレッド通信には主に 3 つの方法があります:

1. グローバル変数

プロセス内のスレッド間でのメモリ共有は、一般的な通信方法および対話方法です。

注: グローバル変数を定義するときは、コンパイラがこの変数を最適化しないように volatile を使用することをお勧めします。

2. メッセージ メッセージ メカニズム

一般的に使用されるメッセージ通信には、PostMessage と PostThreadMessage という 2 つの主要なインターフェイスがあります。

PostMessage は、メッセージを送信するスレッドです。メインウィンドウに移動し、メッセージを送信します。 PostThreadMessage は、2 つのスレッド間の通信インターフェイスです。

2.1.PostMessage()

関数プロトタイプ:

B00L PostMessage (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

パラメータ:

hWnd: ウィンドウ プログラムがメッセージを受信するウィンドウのハンドル。特定の意味を持つ 2 つの値が使用可能です:

HWND.BROADCAST: メッセージは、無効または非所有のウィンドウや上書きされたウィンドウを含む、システムのすべてのトップレベル ウィンドウに送信されます

およびポップアップウィンドウ。メッセージは子ウィンドウには送信されません。

NULL: この関数の動作は、現在のスレッドの識別子に設定されたパラメーター dwThread を使用して PostThreadMessage 関数を呼び出すことと同じです。

Msg: 送信するメッセージを指定します。

wParam: 追加のメッセージ固有の情報を指定します。

IParam: 追加のメッセージ固有の情報を指定します。

戻り値: 関数呼び出しが成功した場合、戻り値は 0 以外です。関数呼び出しが失敗した場合、戻り値は 0 です。

MS には、メッセージ間の通信用の SendMessage メソッド SendMessage() も用意されています。これと PostMessage の違いは、

SendMessage は同期であるのに対し、PostMessage は非同期です。 SendMessage は、送信されたメッセージが実行されるまで待ってから戻る必要があります。

2.2.PostThreadMessage()

PostThreadMessage メソッドは、指定されたスレッドにメッセージを送信できます。

関数プロトタイプ: BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam, LPARAM lParam);

パラメータは、ThreadId を除き、基本的に PostMessage と同じです。

ターゲット スレッドは、GetMessage() メソッドを通じてメッセージを受信します。

注: この方法を使用する場合、ターゲット スレッドには独自のメッセージ キューがすでに存在している必要があります。それ以外の場合は、ERROR_INVALID_THREAD_ID エラーが返されます。

PeekMessage() を使用して、スレッドのメッセージ キューを作成できます。

3. CEvent オブジェクト

CEvent は MFC のオブジェクトであり、CEvent のトリガー状態を変更して、スレッド間の通信と同期を実現できます。

以上がスレッド間の通信のいくつかの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。