Есть процесс который висит в фоне и периодически выполняет какиенибудь действия. Процесс не имеет окон. Внутри всё организовано так:
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 )
{
...делаем дело...
}
}
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>WM_ENDSESSION
Краткость — сестра таланта
надо еще не забыть MessagePump в цикл добавить.... тогда можно WM_ENDSESSION ждать, а можно PostThreadMessage пользовать для ручного завершения...
... << Rsdn@Home 1.1.4 beta 1 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, Andrew S, Вы писали:
>>>>> Есть процесс который висит в фоне и периодически выполняет какиенибудь действия. [b]Процесс не [...] AS>Не будет. Т.о. у вас варианты на выбор — либо создавать консоль, либо скрытое окно
решение оказалось гораздо более простым — вместо Sleep() надо использовать WaitForSingleObject(). В этом случае программа завершается без вопросов, и винда не выкидывает никаких сообщений.
Здравствуйте, vlaman, Вы писали:
V>как тогда быть? получается что кроме как создавать окно и ловить им сообщение, других V>способов решения в win32 нет?
есть — читай мой пост
... << Rsdn@Home 1.1.4 beta 1 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
V>Каким образом я могу узнать что мне необходимо завершатся (пользователь нажал завершение работы)? V>В данном случае оно всё таки завершается — но на экран выскакивает сообщение что процесс необходимо завершить или подождать — хотелось бы чтобы такого не было.
V>Подскажите плиз, заранее благодарен!
Кстати, в контексте не отлова события, а просто непоказа окна завершения — может еще SetProcessShutdownParameters(хх,SHUTDOWN_NORETRY) поможет?
Здравствуйте, Andrew S, Вы писали:
V>>Каким образом я могу узнать что мне необходимо завершатся (пользователь нажал завершение работы)? V>>В данном случае оно всё таки завершается — но на экран выскакивает сообщение что процесс необходимо завершить или подождать — хотелось бы чтобы такого не было.
V>>Подскажите плиз, заранее благодарен!
AS>Кстати, в контексте не отлова события, а просто непоказа окна завершения — может еще SetProcessShutdownParameters(хх,SHUTDOWN_NORETRY) поможет?
Здравствуйте, vlaman, Вы писали:
V>решение оказалось гораздо более простым — вместо Sleep() надо использовать WaitForSingleObject(). В этом случае программа завершается без вопросов, и винда не выкидывает никаких сообщений.
Здравствуйте, vlaman, Вы писали:
V>Есть процесс который висит в фоне и периодически выполняет какиенибудь действия. Процесс не имеет окон. Внутри всё организовано так:
V>while ( flag ) V>{ V> Sleep(1000); V> if ( action_needed ) V> { V> ...делаем дело... V> } V>}
V>Каким образом я могу узнать что мне необходимо завершатся (пользователь нажал завершение работы)? V>В данном случае оно всё таки завершается — но на экран выскакивает сообщение что процесс необходимо завершить или подождать — хотелось бы чтобы такого не было.
V>Подскажите плиз, заранее благодарен!
Я делаю так
MSG msg
while(GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg); // Т.к нет оконной процедуры, то IMHO диспатсер не нужен но пусть будетif(msg.message==WM_ENDSESSION)
DoSomeWork();
}
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....