Где я должен добавить свой собственный код в шаблон службы?

Корпорация Майкрософт предоставляет полный образец обслуживания, чтобы начать с написания служб Windows. Однако я не понимаю следующую часть из этого файла :

ReportSvcStatus( SERVICE_RUNNING, NO_ERROR, 0 );

// TO_DO: Perform work until service stops.

while(1)
{
    // Check whether to stop the service.

    WaitForSingleObject(ghSvcStopEvent, INFINITE);

    ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 );
    return;
}

Я не понимаю точку бесконечного цикла, содержащую оператор return. Разве это не побеждает цель?

Кажется, рекомендуется писать служебный контент до цикла while, но затем, если мы не достигнем следующей строки:

WaitForSingleObject(ghSvcStopEvent, INFINITE);

... Служба не сможет остановиться, когда произойдет соответствующее событие, не так ли?

Является ли этот шаблон неправильным? Как я могу заставить мой сервис ждать внешнего триггера, не делая его непроницаемым для остановки вызовов?

c++,windows,service,windows-services,

1

Ответов: 1


2 принят

Да, этот пример не очень хорошо написан. Основной цикл службы лучше написан (концептуально) как:

// Main processing loop
while (!quit)
    do_work ();

ReportSvcStatus (SERVICE_STOPPED, NO_ERROR, 0);
return;

И в обработчике обслуживания у вас есть:

// CtrlHandler callback
DWORD WINAPI CtrlHandler (DWORD dwControl, DWORD  dwEventType, LPVOID lpEventData, LPVOID lpContext)
{
    ...
    if (dwControl == SERVICE_CONTROL_STOP)
        quit = true;
    return NO_ERROR;
}

Где quitглобальная переменная.

На практике (чтобы избежать цикла занятости) служба, вероятно, обычно сидит вокруг, ожидая какого-то ожидаемого объекта для чего-то делать. Представим себе, ради аргумента, это РУЧКА, называемая, скажем ghWakeupEvent, созданная через CreateEvent()и снова хранимая в глобальной переменной.

Затем код становится чем-то вроде:

// Main processing loop
while (1)
{
    WaitForSingleObject (ghWakeupEvent, INFINITE);
    if (quit)
    {
        ReportSvcStatus (SERVICE_STOPPED, NO_ERROR, 0);
        return;
    }

    if (something_to_do)
        do_work ();
}

// CtrlHandler callback
DWORD WINAPI CtrlHandler (DWORD dwControl, DWORD  dwEventType, LPVOID lpEventData, LPVOID lpContext)
{
    ...
    if (dwControl == SERVICE_CONTROL_STOP)
    {
        quit = true;    // do this first!!
        SetEvent (ghWakeupEvent);
    }

    return NO_ERROR;
}

Примечание: нет необходимости (или указывать) ghSvcStopEvent. Пример MSDN - это путаница.

C ++, окно, сервис, окна-услуги,
Похожие вопросы