質問: <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <目的> COMポートでバイナリデータの送受信を行う <プログラムの仕様> 1.ダイアログの「受信開始」ボタンを押す データ受信開始の合図"0x01"を相手機器に送る 2.相手機器がデータを永遠と送信してくる 3.データを永遠と受信する 4.ダイアログの「受信終了」ボタンを押す データ受信終了の合図"0x02"を相手機器に送る 5.相手機器がデータ送信を止める 6.受信終了 <質問> 上記のプログラム仕様を満たすには、マルチスレッドにしないといけないと思うのですが(データの送信と受信でスレッドを分ける)、具体的に何をどうすればマルチスレッドになるのか分かりません。 マルチスレッドに必要な関数、 プログラムの全体的な流れなど、 基本的な部分を教えてください。 宜しくお願いします。
回答: 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 *で良いです。