Есть процесс который висит в фоне и периодически выполняет какиенибудь действия. Процесс не имеет окон. Внутри всё организовано так:
while ( flag )
{
Sleep(1000);
if ( action_needed )
{
...делаем дело...
}
}
Каким образом я могу узнать что мне необходимо завершатся (пользователь нажал завершение работы)?
В данном случае оно всё таки завершается — но на экран выскакивает сообщение что процесс необходимо завершить или подождать — хотелось бы чтобы такого не было.
vlaman wrote: > > Есть процесс который висит в фоне и периодически выполняет какиенибудь действия. Процесс не имеет окон. Внутри всё организовано так: > > while ( flag ) > { > Sleep(1000); > if ( action_needed ) > { > ...делаем дело... > } > } > > Каким образом я могу узнать что мне необходимо завершатся (пользователь нажал завершение работы)? > В данном случае оно всё таки завершается — но на экран выскакивает сообщение что процесс необходимо завершить или подождать — хотелось бы чтобы такого не было.
Ну окна то у меня нет, как я буду ловить сообщение?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Привет!
PD>vlaman wrote: >> >> Есть процесс который висит в фоне и периодически выполняет какиенибудь действия. Процесс не имеет окон. Внутри всё организовано так: >> >> while ( flag ) >> { >> Sleep(1000); >> if ( action_needed ) >> { >> ...делаем дело... >> } >> } >> >> Каким образом я могу узнать что мне необходимо завершатся (пользователь нажал завершение работы)? >> В данном случае оно всё таки завершается — но на экран выскакивает сообщение что процесс необходимо завершить или подождать — хотелось бы чтобы такого не было.
PD>WM_ENDSESSION
>> Есть процесс который висит в фоне и периодически выполняет какиенибудь действия. Процесс не имеет окон. Внутри всё организовано так: >> >> while ( flag ) >> { >> Sleep(1000); >> if ( action_needed ) >> { >> ...делаем дело... >> } >> } >> >> Каким образом я могу узнать что мне необходимо завершатся (пользователь нажал завершение работы)? >> В данном случае оно всё таки завершается — но на экран выскакивает сообщение что процесс необходимо завершить или подождать — хотелось бы чтобы такого не было.
PD>WM_ENDSESSION
Ok, thanks!
Но есть ли способ сделать это без окна?
В unix я просто получаю сигнал от системы, и по нему завершаю процесс.
Как такое реализовать в win32? Возможно ли это вообще?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Привет!
PD>vlaman wrote: >> >> Ну окна то у меня нет, как я буду ловить сообщение?
PD>Сделай невидимое. PD>-- PD>With best regards, PD> Pavel Dvorkin
Здравствуйте, Andrew S, Вы писали:
>>> Есть процесс который висит в фоне и периодически выполняет какиенибудь действия. Процесс не имеет окон. Внутри всё организовано так: >>> >>> while ( flag ) >>> { >>> Sleep(1000); >>> if ( action_needed ) >>> { >>> ...делаем дело... >>> } >>> } >>> >>> Каким образом я могу узнать что мне необходимо завершатся (пользователь нажал завершение работы)? >>> В данном случае оно всё таки завершается — но на экран выскакивает сообщение что процесс необходимо завершить или подождать — хотелось бы чтобы такого не было. PD>>WM_ENDSESSION AS>См. выделенное. AS>Решение — SetConsoleCtrlHandler.
похоже то что надо!
если программа не консольная — работать это будет?
vlaman wrote: > > Ok, thanks! > Но есть ли способ сделать это без окна? > В unix я просто получаю сигнал от системы, и по нему завершаю процесс. > Как такое реализовать в win32? Возможно ли это вообще?
Одно решение тебе предложил Andrew S.
Еще одно — см. Winlogon Notification Packages в MSDN. Это намного
сложнее.
>> Решение — SetConsoleCtrlHandler.
PD>Так ты отловишь logoff, а не shutdown. Впрочем, это в данном случае все PD>равно.
А в MSDN заглянуть?
CTRL_LOGOFF_EVENT A signal that the system sends to all console processes when a user is logging off. This signal does not indicate which user is logging off, so no assumptions can be made.
CTRL_SHUTDOWN_EVENT A signal that the system sends to all console processes when the system is shutting down.
Note that this signal is received only by services. Interactive applications are terminated at logoff, so they are not present when the system sends this signal. Services also have their own notification mechanism for shutdown events. For more information, see Handler.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Привет!
PD>vlaman wrote: >> похоже то что надо! >> если программа не консольная — работать это будет?
PD>Не будет.
как тогда быть? получается что кроме как создавать окно и ловить им сообщение, других
способов решения в win32 нет?
Andrew S wrote: > > >> Решение — SetConsoleCtrlHandler. > > PD>Так ты отловишь logoff, а не shutdown. Впрочем, это в данном случае все > PD>равно. > > А в MSDN заглянуть?
А если внимательно прочитать, то, что ты процитировал ? Я подчеркнул.
> >
> CTRL_LOGOFF_EVENT A signal that the system sends to all console processes when a user is logging off. This signal does not indicate which user is logging off, so no assumptions can be made.
> CTRL_SHUTDOWN_EVENT A signal that the system sends to all console processes when the system is shutting down.
> ____Note that this signal is received only by services____. Interactive applications are terminated at logoff, so they are not present when the system sends this signal. Services also have their own notification mechanism for shutdown events. For more information, see Handler.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Привет!
PD>Andrew S wrote:
>> Решение — SetConsoleCtrlHandler.
PD>Так ты отловишь logoff, а не shutdown. Впрочем, это в данном случае все PD>равно.
А что если сервис сделать — там все события есть.
а если не сервис — так захукать можно.
PD>-- PD>With best regards, PD> Pavel Dvorkin
>>>> Есть процесс который висит в фоне и периодически выполняет какиенибудь действия. Процесс не имеет окон. Внутри всё организовано так: >>>> >>>> while ( flag ) >>>> { >>>> Sleep(1000); >>>> if ( action_needed ) >>>> { >>>> ...делаем дело... >>>> } >>>> } >>>> >>>> Каким образом я могу узнать что мне необходимо завершатся (пользователь нажал завершение работы)? >>>> В данном случае оно всё таки завершается — но на экран выскакивает сообщение что процесс необходимо завершить или подождать — хотелось бы чтобы такого не было. PD>>>WM_ENDSESSION AS>>См. выделенное. AS>>Решение — SetConsoleCtrlHandler.
V>похоже то что надо! V>если программа не консольная — работать это будет?
Не будет. Т.о. у вас варианты на выбор — либо создавать консоль, либо скрытое окно
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Привет!
PD>vlaman wrote:
>> как тогда быть? получается что кроме как создавать окно и ловить им сообщение, других >> способов решения в win32 нет?
PD>Я же тебе писал про Winlogon Notification Packages. Хочешь с ними PD>мучаться — пожалуйста. Всего то и делов — написать DLL и PD>зарегистрировать в реестре
Andrew S wrote: > > PD>А если внимательно прочитать, то, что ты процитировал ? Я подчеркнул. > > Но мы же не знаем, что у него — сервис или нет Если даже консоли нет — очень похоже на сервис.
Знаем
См. первое письмо
>Есть процесс который висит в фоне и периодически выполняет какиенибудь действия. Процесс не >имеет окон. Внутри всё организовано так:
while ( flag )
{
Sleep(1000);
if ( action_needed )
{
...делаем дело...
}
}