• ベストアンサー

親スレッドが子スレッドを監視する方法について(マルチスレッド)

こんにちは。 私は、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関数を監視する方法があるのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • meruty
  • ベストアンサー率81% (9/11)
回答No.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(省略);   ・・・・ }

参考URL:
http://msdn2.microsoft.com/ja-jp/library/kdzttdcb.aspx
bird0214
質問者

お礼

詳しい回答ありがとうございます。 これを参考にさせていただき、手直ししたところ解決できました。

その他の回答 (1)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

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

bird0214
質問者

お礼

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