0

ログオン イベントを待機するサービスを作成しています。このイベントが発生すると、サービスはスレッドを開始し、残りの作業を実行します。

サービス内:

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 回以上ログオンしている場合、システムを再起動しないと十分ではありません。

4

1 に答える 1

0

スレッドを破棄する必要がないように、スレッド プールを使用します。アプリケーションが終了するとき、ハンドルを閉じる必要はありません。Windows がそれを行います。

于 2013-10-27T18:53:21.170 に答える