- ベストアンサー
親スレッドが子スレッドを監視する方法について(マルチスレッド)
こんにちは。 私は、A端末から送信されたパケットをB端末で受信し、B端末で受信したそのパケットを再度、A端末へ送信するというプログラムを作成しました。 Phase1.A端末(送信側)→B端末(受信側) Phase2. B端末→A端末 ということです。 上記を実現するために、送信端末において、送信スレッド(親スレッド)と受信スレッド(子スレッド)を立てマルチスレッド処理を行っています。以下にプログラムの概要を示します。 main(int argc ,char *argv[]){ UDPSend(s_port,szServer); } static int UDPSend(unsigned short s_port,char *szServer){ hTh = (HANDLE)_beginthreadex(NULL, 0, UDPReceiveData, NULL, 0, &thID); while((n = fread(send_Buf,1,SEND_DATA_SIZE,fp)) != 0) { sendto(s1, send_Buf, n, 0, (LPSOCKADDR)&addrin1, sizeof(addrin1)); } } unsigned __stdcall UDPReceiveData(void *lpx){ while (1) { size = recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen); return 0; } } UDPSend関数にて、パケットをB端末へ送信。UDPReceiveData関数にて、B端末からのパケットを受信しています。この場合、UDPSend関数(スレッド?)がUDPReceiveData関数より先に、終わってしまう場合が生じると思っているのですが。 UDPSend関数がUDPReceiveData関数を監視する方法があるのでしょうか? よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「スレッドの生成~終了待ち~ハンドル解放」を main() でやってみてはいかがですか? #include <windows.h> #include <stdio.h> #include <process.h> main(){ HANDLE hTh; unsinged thID; hTh = createthreadex(省略); 送信処理(); WaitForSingleObject( hTh, INFINITE ); //受信スレッド終了待ち CloseHandle(hTh); } 送信処理(){ ・・・・ sendto(省略); ・・・・ } 受信処理(){ ・・・・ recvfrom(省略); ・・・・ }
その他の回答 (1)
- sha-girl
- ベストアンサー率52% (430/816)
WaitForSingleObjectを使えばそのスレッドが終了するまで待つことが出来ます。 static int UDPSend(unsigned short s_port,char *szServer){ hTh = (HANDLE)_beginthreadex(NULL, 0, UDPReceiveData, NULL, 0, &thID); while((n = fread(send_Buf,1,SEND_DATA_SIZE,fp)) != 0) { sendto(s1, send_Buf, n, 0, (LPSOCKADDR)&addrin1, sizeof(addrin1)); } WaitForSingleObject(hTh,INFINITE);//スレッドがシグナル状態になるまで待つ } http://www.doumo.jp/postgretips/tips.jsp?tips=104
お礼
解決しました。 ありがとうございました。
お礼
詳しい回答ありがとうございます。 これを参考にさせていただき、手直ししたところ解決できました。