Last Updated 2002/03/02
Programming Tips Windows COMMポート  索 引 
マルチスレッドの通信
2002/03/02

希望動作
読み込み用スレッドの状態がどうであれ,書き込みスレッドが動作可能で,読み込みスレッドは受信データが無い場合は寝ている.


共通条件
1. COM デバイスのオープンはプライマリスレッド(書き込みスレッド)で行う
2. SetCommTimeouts() 設定もプライマリスレッドで行う
3. その後,セカンダリスレッド(読み込みスレッド)を作成する
4. 両方のスレッドとも,プライマリスレッドが COM デバイスオープン時に得たハンドルを使用して読み書きする。


パターン1
SetCommTimeouts() を以下のパラメータで設定した場合。
        ReadIntervalTimeout = MAXDWORD;
        ReadTotalTimeoutMultiplier = 0;
        ReadTotalTimeoutConstant = 0;

パターン2
SetCommTimeouts() を以下のパラメータで設定した場合。
        ReadIntervalTimeout = 0;
        ReadTotalTimeoutMultiplier = 0;
        ReadTotalTimeoutConstant = 0;

※パターン1と2では、ReadIntervalTimeout の設定値が異なる

<<結果>>
                95                    NT
=====================================================================
パターン1      ReadFile()              ReadFile()
                 すぐ抜ける              すぐ抜ける

                WriteFile()             WriteFile()
                  ブロックされずに        ブロックされずに
                  送信できる              送信できる
---------------------------------------------------------------------
パターン2      ReadFile()              ReadFile()
                  受信データを待つ        受信データを待つ

                WriteFile()             WriteFile()
                  ブロックされずに        ブロックされる
                  送信できる
=====================================================================

パターン2にてNTと95系で動作が違ってくる.
NTでパターン2の95系の様に動作させるには非同期I/Oを使用する.


NT(NT3.51)でのやり方は

受信待ちスレッド
(1) OverLapped.hEventにイベントをセット
(2) WaitCommEventのパラメータにOverLapped.hEventをセットしてコール
(3) WaitForSingleObjectでイベントを待つ
(4) イベントを受信したら受信イベントを発行する
(5) イベントをリセットし(2)から繰り返す


受信処理(スレッドにはしていません)
(1) 受信イベントを受信したら、受信キューのバイト数を調べ対象バイト数になるまで待つ
(2) OverLapped.hEventにイベントをセット
(3) ReadFileのパラメータに対象バイト数,OverLapped.hEventをセットしてコール
(4) WaitForSingleObjectでイベントを待つ
(5) GetOverLappedResultで実際に取得したバイト数を得る

送信処理(スレッドにはしていません)
受信処理の(3)〜(5)のReadをWriteに取得を書込と読み代える


参照
前後のTips
マルチスレッドの通信

DSS ProgrammingTipsCGI Ver2.02