1

FTPサーバー上のファイルを読み書きする簡単なアプリを作成しようとしています。スレッドを作成します

    HANDLE hThread;
    unsigned threadID;
    hThread = (HANDLE)_beginthreadex( NULL, 0, &foo, NULL, 0,NULL );    
    CloseHandle( hThread );

関数 foo() は、このような新しいインターネット セッションを作成します

      CInternetSession session(_T("Session"));

しかし、CInternetSession session(_T("Session")) スレッドを呼び出した後、スレッドは終了します

それを修正する方法はありますか?

4

1 に答える 1

0

イベントを待機するか、ループに入って関数の終了を防ぐには、スレッド関数が必要です。その関数が終了すると、スレッドは終了します。

たとえば、Windows イベント API を使用できます。

void foo(){
  // The Event exitSessionEvent must be declared somewhere where the controlling 
  // thread can access it. This might be a global event for example (in a namespace).
  // You must initialise it using CreateEvent.

  CInternetSession session(_T("Session"));
  // ... do some stuff ....
  WaitForSingleObject(exitSessionEvent, INFINITE);
  session.Close(); //Done so cleanup
}

現在、スレッド関数は、イベント「exitSessionEvent」が設定されるまで終了しません (他の誰かによって)。

ある種のフラグを使用してwhile(flag)ループすることもできますが、イベントはマルチスレッド アプリケーションで自分自身を表現するより明確な方法だと思います。

また、スレッドが終了するまで待機しない限り、スレッドを作成したスレッドを閉じるべきではありません。スレッドのハンドルを閉じる前に、新しいスレッドが終了するのを待っているようには見えません。イベントを使用する場合は、次のようにします。

HANDLE hThread;
unsigned threadID;
hThread = (HANDLE)_beginthreadex( NULL, 0, &foo, NULL, 0,NULL );  
WaitForSingleObject(hThread, INFINITE);  
CloseHandle( hThread );

これは、ハンドルを閉じる前にスレッドが終了するのを待ちます。

于 2013-06-10T12:32:51.930 に答える