Last Updated 2002/03/02 |
Programming Tips Windows COMMポート | 索 引 |
マルチスレッドの通信
2002/03/02
希望動作 読み込み用スレッドの状態がどうであれ,書き込みスレッドが動作可能で,読み込みスレッドは受信データが無い場合は寝ている. 共通条件 1. COM デバイスのオープンはプライマリスレッド(書き込みスレッド)で行う 2. SetCommTimeouts() 設定もプライマリスレッドで行う 3. その後,セカンダリスレッド(読み込みスレッド)を作成する 4. 両方のスレッドとも,プライマリスレッドが COM デバイスオープン時に得たハンドルを使用して読み書きする。 パターン1 SetCommTimeouts() を以下のパラメータで設定した場合。
パターン2 SetCommTimeouts() を以下のパラメータで設定した場合。
※パターン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に取得を書込と読み代える 参照 |
|