受信スレッドの一般的な使い方について – プログラミング – Home

受信スレッドの一般的な使い方について
 
通知
すべてクリア

[解決済] 受信スレッドの一般的な使い方について


roots
 roots
(@roots)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

VC++6.0 MFCです。

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

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

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

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

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

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

よろしくお願いします。


引用未解決
トピックタグ
roots
 roots
(@roots)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

タイトルが文字化けしました。

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

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


返信引用
ララ
 ララ
(@ララ)
ゲスト
結合: 22年前
投稿: 93
 

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

// 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
 roots
(@roots)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

仲澤@失業者さん、ララさんありがとうございます。

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


返信引用
roots
 roots
(@roots)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

ララさんの作り方を真似て作り直しているのですが、

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

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

よろしくお願いします。


返信引用
ララ
 ララ
(@ララ)
ゲスト
結合: 22年前
投稿: 93
 

m_pThreadP = AfxBeginThread(制御関数名, &構造体);

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

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


返信引用
roots
 roots
(@roots)
ゲスト
結合: 17年前
投稿: 10
Topic starter  

ララさんありがとうございます。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました