受信スレッドの一般的な使い方について

[戻る]
roots 2008/02/15(金) 09:14:01
VC++6.0 MFCです。

RS-232Cを使った通信ソフトを作りながら、勉強をしているのですが、
受信関数をスレッド化しようと考えています。

スレッドをどのような使い方をしたら良いのか悩んでいます。

ソフトは、PC側からデータの送信要求を行うと、
計測器が測定値を送ってくるというものです。
(PC側のソフトを作成しています。)

送信要求は OnTimer() で約1秒毎に行います。
受信スレッドをその都度 AfxBeginThread()で作成して
みたのですが、スレッドが動き始めるのがとても遅い感じがしました。

スレッドは最初に作っておいて空のループをして、
送信要求があった時に受信処理を行うものが一般的なのでしょうか?
while(スレッド終了用フラグ){
 if(送信要求ありフラグ){
  受信処理
 }
}

もっと一般的な方法があるのでしょうか?
仕様によって良い方法が違ってくるとは思いますが、
一般的な方法はどのような方法でしょうか?

よろしくお願いします。

roots 2008/02/15(金) 09:17:31
タイトルが文字化けしました。

「受信スレッドの一般的な使い方について」

仲澤@失業者 2008/02/15(金) 09:52:21
スレッドの起動(初期化処理)には時間がかかります。
一般的な通信アプリの受信スレッドは、アプリ開始直後に起動し、
アプリが終了するまで動きっぱなしなのが普通です。
特に通信を遮断する必要がある場合は、そのつど
スレッドを起動終了しても良いかもしれません。

ララ 2008/02/15(金) 09:55:45
いろいろやり方はあると思いますが
私はこんな感じでつくったことがあります。
プライマリースレッドでイベントをセットすると
受信スレッドが終了するしくみです。

// hogehoge の部分はいろいろとテクニックが必要になると思います。
それは、通信仕様によるのでどうすれば良いかは回答できかねますが。。。

DWORD dwCount;
DWORD dwErrors;
DWORD dwCount;
COMSTAT cs;

while (::WaitForSingleObject(hEvent, 1) == WAIT_TIMEOUT)
{
  ::ClearCommError(hF, &dwErrors, &cs);
  dwCount = cs.cbInQue;
  if (dwCount)  // 受信バッファにデータがあれば
  {
     // hogehoge
  }
}

roots 2008/02/15(金) 10:13:06
仲澤@失業者さん、ララさんありがとうございます。

スレッドは一回一回作り直すのは、
良くないのですね。とても参考になりました。

roots 2008/02/15(金) 14:21:36
ララさんの作り方を真似て作り直しているのですが、

>プライマリースレッドでイベントをセットすると
>受信スレッドが終了するしくみです。

どのように、どんなイベントをセットしたら良いのか
アドバイス頂けませんでしょうか?

よろしくお願いします。

ララ 2008/02/15(金) 15:01:11
m_pThreadP = AfxBeginThread(制御関数名, &構造体);

のようにワーカスレッドを起動します。
構造体のメンバに HANDLE 型の イベントオブジェクトを用意します。
こうすることで、プライマリー側ではイベントをシグナル状態にでき、
ワーカスレッド側では、それを監視することができます。

この程度なら、フラグを使っても十分かと思いますけど。

roots 2008/02/15(金) 16:50:44
[[解決]]
ララさんありがとうございます。

ララさんに教えて頂いた方法でも動作させる事が出来ました。
いろいろな方法を勉強したいので、とても参考になりました。

古いスレッドには追加発言できません。