ログオン イベントを待機するサービスを作成しています。このイベントが発生すると、サービスはスレッドを開始し、残りの作業を実行します。
サービス内:
while ( WaitForSingleObject( ghSvcStopEvent, 0 ) != WAIT_OBJECT_0 )
{
DWORD dwEventFlags;
BOOL bRes;
// WTSWaitSystemEvent waits until a logon event ocurs
bRes = WTSWaitSystemEvent( WTS_CURRENT_SERVER_HANDLE, WTS_EVENT_LOGON, &dwEventFlags );
if ( dwEventFlags == WTS_EVENT_NONE )
{
ShowErrorText( "Cancelling waiting for logon event. Service shutting down.", 0, true );
}
if ( bRes )
{
// Someone has logged on
HANDLE hThread = CreateThread( NULL, 0, ServiceWorkerThread, NULL, 0, &dwThreadID );
}
else
{
ShowErrorText( "WTSWaitSystemEvent failed.", GetLastError(), true );
}
}//while
私の質問は、CreateThread によって返されたハンドルを正しく閉じるにはどうすればよいですか? WaitForMultipleObjects を使用する場合、最初のパラメーターはスレッドのサイズです。オブジェクト ハンドルの最大数は MAXIMUM_WAIT_OBJECTS で、これは 36 です。つまり、これは 36 のスレッドしか開始できないことを意味します。しかし、サービスが非常に長時間実行されている場合、ユーザーが 36 回以上ログオンしている場合、システムを再起動しないと十分ではありません。