イベントを待機するか、ループに入って関数の終了を防ぐには、スレッド関数が必要です。その関数が終了すると、スレッドは終了します。
たとえば、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 );
これは、ハンドルを閉じる前にスレッドが終了するのを待ちます。