イベント動作中のメッセージ処理

[戻る]
ちか 2008/02/27(水) 19:14:24
VC++2005 MFC WindowsはXPです。

すでにある232C通信用プログラムをもとに、新たに作成しようとしています。

すでにあるプログラムでの動作は、画面上のボタンをクリックすると
エディットボックス(例としてIDを「IDC_EDT_SEND」とします)の文字を送信し、
マルチスレッドで動いている受信処理が受信データを受けとるとメッセージを送り、
読み取り専用の別のエディットボックス(例として「IDC_EDT_MONI」とします)に表示
します。

今回、送信するためのエディットボックスと、表示用のエディットボックスをそれぞれ
増やします。(例として、「IDC_EDT_SEND2」「IDC_EDT_MONI2」が追加になるとしま
す)ボタンは1つのままです。
ボタンをクリックしたときに、IDC_EDT_SENDを送信し、次にIDC_EDT_SEND2を送信するよ
うにしました。

これですと、IDC_EDT_SENDのデータを送ったときに232Cから1つデータが返った分はマ
ルチスレッドで動いている受信処理がメッセージを1回なげます。
続けて、IDC_EDT_SEND2を投げると、同じように受信メッセージを1回なげます。
IDC_EDT_SENDをすべて送信してから(ボタンクリックの処理がおわりになってから)受
信したメッセージを順に表示するようになり、送信したデータに対して返ってきたデー
タなのかがわかりません。


まだまだ初心者のため、うまく伝えられなくてすみません。
アドバイスよろしくお願いします。

ちか 2008/02/27(水) 19:31:22
たびたびすみません。

希望する動作としては、
IDC_EDT_SENDを送信→データ受信→IDC_EDT_MONIに表示→IDC_EDT_SEND2を送信→データ
受信→IDC_EDT_MONI2に表示・・・となってほしいのです。

これですと、マルチスレッドではないように変更を行う以外に方法はないでしょうか。
変更をするとなると、大幅な修正が必要となるため、できるだけ現在のプログラムを生
かしていきたいと思っております。

アドバイスよろしくお願いします。

紅' 2008/02/28(木) 10:01:26
こういうことでしょうか。

現状

・送信するデータを編集するエディットボックスがある
・画面上のボタンを押下すると、エディットボックスのデータを送信する
・データは RS-232C? で送受信する
・受信データは RS-232C? を監視する別スレッドが動いていて、これが勝手に受信処理
をする
・受信したデータはリソース ID が IDC_EDT_MONI であるエディットボックスに勝手に表
示される

やりたいこと

・送信するデータを編集するエディットボックスを2つに増やす
・送信用エディットボックスに1対1で対応する受信用エディットボックスを作成する
・受信スレッドで受信したデータを送信に対応する受信用エディットボックスに表示する

困ったこと

・現状では送信元のデータに関わらず一律に IDC_EDT_MONI のエディットボックスに
 データが表示されるため、送信データと受信データとの対応がわからない

以上に誤りがないとして、私がやりそうなことを記述します。

 1. IDC_EDT_MONI を非表示化する
 2. 送信用エディットボックスに対応する受信用エディットボックスをそれぞれ(新たに)
作る
 3. IDC_EDT_MONI に変更を検知するイベントハンドラをくっつける
 4 .送信と受信のエディットボックスの対応表を配列かなにかで作成する
    unsigned int list[][ 2 ]= { { IDC_EDT_SEND1, IDC_EDT_MONI1 }, ・・・, { 
0, 0 } };
   ・・・みたいな
 5. 送信実行直前に送信回数カウンタ(グローバル変数?)を初期化する
 6. 4 で作成した対応表の[送信回数カウンタ]番目の送信エディットボックスの内容を送
信する
    ( ここで一旦処理を終了することになります )
 7. 2 で作成したイベントハンドラの関数でデータが変更されるのを待つ
  ( このイベントで処理が再開されることになります )
 8. 4 で作成した対応表の[送信回数カウンタ]番目の受信用エディットボックスに 
IDC_EDT_MONI の内容をコピーする
 9. 送信回数カウンタ +1
10. 4 で作成した対応表の内容が 0 になるまで 6 以降を繰り返す

お役に立つことを祈ります。

紅' 2008/02/28(木) 10:04:10
誤りがありました。失礼しました。

>7. 2 で作成したイベントハンドラの関数でデータが変更されるのを待つ
 ↓
7. 3 で作成したイベントハンドラの関数でデータが変更されるのを待つ

ちか 2008/02/28(木) 12:03:59
紅' さん、ありがとうございます。

スレッドをどうにかしないといけないかと、とても悩んでおりました。
そのような方法があるとは・・!!

大変、参考になりました。
ありがとうございました。

ちか 2008/02/28(木) 18:44:06
[[解決]]
紅' さんのアドバイスをもとに、思っていた動作を行うことができました。
CStringArrayを用いました。

ありがとうございました。

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