
<プログラム環境>
Windows XP
VC++6.0
MFC AppWizard(exe)
ダイアログベース
<目的>
COMポートでバイナリデータの送受信を行う
<プログラムの仕様>
1.ダイアログの「受信開始」ボタンを押す
データ受信開始の合図"0x01"を相手機器に送る
2.相手機器がデータを永遠と送信してくる
3.データを永遠と受信する
4.ダイアログの「受信終了」ボタンを押す
データ受信終了の合図"0x02"を相手機器に送る
5.相手機器がデータ送信を止める
6.受信終了
<質問>
上記のプログラム仕様を満たすには、マルチスレッドにしないといけないと思うのですが(データの送信と受信でスレッドを分ける)、具体的に何をどうすればマルチスレッドになるのか分かりません。
マルチスレッドに必要な関数、
プログラムの全体的な流れなど、
基本的な部分を教えてください。
宜しくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
Win32APIのCreateThread()を呼べばスレッドが起動します。
参考書としては
「マルチスレッドプログラミング入門」ISBN:4756116825
をお勧めします。
簡単な例としては下記のような感じ
スレッドを複数動作させる場合にはmutexとか必要ですが一個だけなら排他は考えなくても実害は無いと思います。
スレッドに渡すデータはローカル変数をアドレス渡ししてはいけません。
スレッドが渡された変数を参照した時点で呼び出し元の処理が終了して領域が開放されてしまっているいる可能性があります。
スタックではなくヒープのアドレスを渡すようにした方が良いです。
HANDLE threadHandle ;//スレッドハンドル
DWORD thid ; //スレッドID
// Dataはスレッドに渡すデータ(型は何でもよい)のアドレス:必要なければNULL
threadHandle = CreateThread(0,0,(LPTHREAD_START_ROUTINE)ThreadFunc,(void *)Data,0,&thid) ;
if (threadHandle == NULL) return ;
CloseHandle(threadHandle) ; // スレッドが起動したらハンドルを閉じます
// スレッド動作する関数
void ThreadFunc(DATA_t *Data) // ←ポインタ変数を1個受け取れる
{
・・スレッドの処理本体:省略・・
}
DATA_tは必要なら適時定義してください。
必要なければvoid *で良いです。
この回答への補足
buriburi3様、有難うございます。
ご指摘頂いた通りだと思うのですが、以下のようにコーディングしました。
OnButton()はダイアログのボタンを押すと実行されます。
void CMyDlg::OnButton()
{
HANDLE hThread;//スレッドハンドル
DWORD dwThreadID;//スレッドID
DWORD Data;
hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)ThreadFunc,&Data,0,&dwThreadID);
}
void ThreadFunc(DWORD *Data)
{
}
コンパイルするとhThread = ...の行に対して以下のエラーが出ます。
error C2440: 'type cast' : '' から 'unsigned long (__stdcall *)(void *)' に変換することはできません。
スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。
何が原因でこのエラーが出るのでしょうか?
宜しければご指摘お願い致します。
No.1
- 回答日時:
まず「永遠と」は「延々と」のつもりかな。
それで仕様を読む限りでは、相手機器も同じプログラムの中でシミュレーションするのでなければマルチスレッドは必要ないように思うけど。
マルチスレッドにしてもあまり書きやすくはないんじゃないかな。
仕様の書き方を変えると
0.ダイヤログを表示して「受信表示」ボタンを待つ
1.ダイアログの「受信開始」ボタンを押されたら
データ受信開始の合図"0x01"を相手機器に送る
2.受信待ちをする(ここで「受信終了」ボタンも待つ)
3.データを受信する(2と繰り返し)
4.ダイアログの「受信終了」ボタンを押されたら
データ受信終了の合図"0x02"を相手機器に送る
5.相手機器がデータ送信を止めたことを確認する(?)
6.受信終了
ですね。(5は必要ないかも)
ここで必要なのは、2でCOMポートの受信と「受信終了」ボタンを同時に待つ複数待ちです。これはWIN32APIだとMsgWaitForMultipleObjects等が使えますし、コンソールアプリケーションではselect等も使えますが、MFCでのやり方は覚えてません。
COMポート通信を非同期アクセスにする必要があるかも。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS GETをPOSTに変更したところ 送信 不能です。 1 2022/04/10 17:31
- iPhone(アイフォーン) 皆さんiPhoneは、機能が少な過ぎますか?? iPhoneには、なぜ僕がAndroid合計3台持ち 2 2022/07/12 19:59
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- ネットワーク OSI参照モデルの各層の役割がわかりません。 3 2023/04/21 21:12
- Android(アンドロイド) iPhoneには、なぜ僕が合計3台持ちしているGalaxy A22やXperiaXZ1、arrows 4 2022/07/12 18:42
- ガラケー・PHS 携帯電話の居場所信号の発信タイミング 3 2022/07/27 14:39
- Outlook(アウトルック) 未読ならば受信トレイから削除する 2 2023/02/12 19:21
- Bluetooth・テザリング Bluetoothを使って知人(複数)のスマホにデータを送りたいのですが、スマホ→スマホの通信の場合 1 2022/06/29 19:20
- その他(メールソフト・メールサービス) メールサーバーは「PC側がメールをDL済みか否か?」を何を以て感知するのか? 2 2022/12/20 14:56
- その他(メールソフト・メールサービス) SMSの質問です。楽天リンクアプリでショートメールが送れない現象について。(受信は出来る) 2 2023/02/19 13:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP のパケットの分断と結合...
-
Outlookの「受信日時」「件名」...
-
シリアル通信時のデータ受信方法
-
CRC-CCITTに関しての仕様とサン...
-
DHCPOFFERの受信について
-
Perl / IO::Socketによる送受信...
-
ソケットプログラミング(配列に...
-
Outlookの「受信日時」「送信者...
-
C++Builder6.0でのシリアル通信
-
recv関数の戻り値について
-
PC98で232c送信winndowで受信で...
-
パソコンに詳しい方教えて下さ...
-
Windows上のファイル操作の履歴...
-
バッチファイルでディレクトリ...
-
Lhaplusが発したと、みられるエ...
-
エクセルが開けません(泣)
-
バックアップの用語
-
FTPの更新を定期チェックして通...
-
linuxサーバにファイルをアップ...
-
VBでスタンバイや休止状態か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Outlookの「受信日時」「件名」...
-
TCP/IP のパケットの分断と結合...
-
UDP受信時の通信異常検知について
-
Outlookの「受信日時」「送信者...
-
C#にてCTI。RS232Cの受信と送信...
-
VC++メッセージの送受信につい...
-
recv関数の戻り値について
-
RS232cを用いた送信プログラム
-
メーラー
-
PC98で232c送信winndowで受信で...
-
「TCPは全二重可能」の意味
-
VBのMSCommコントロールを使っ...
-
シリアル通信時のデータ受信方法
-
WinSockとWinPcapについて
-
マルチスレッドに挑戦したい
-
VC++ 2010 メッセージが文字化...
-
ネットワークでの受信バイト数
-
無線LAN、SIFSについて
-
winsockを使ったTCP及びUDP通信...
-
DHCPOFFERの受信について
おすすめ情報