powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как консольному app выполнить действия при получении консолью WM_CLOSE (нажать крестик)?
7 сообщений из 32, страница 2 из 2
Как консольному app выполнить действия при получении консолью WM_CLOSE (нажать крестик)?
    #38633952
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Но все одно не понимаю, что ты имеешь ввидуЯ хочу сказать, что есть два способа завершения приложения:
1. "Мягкий" - работает atexit();
2. "Суровый" - работает abort().
Кошерный сервис-обёртка должен выдать сигнал мягкого завершения, выждать и только потом пристреливать зависшее приложение.
Если NSSM "стреляет без предупреждения", то он тоже сосёт.

P.S. Про Apache procrun - ничего не скажу: сорцы не особо изучал, а для запуска именно exe-приложений - не использовал.
С java-приложениями (основное назначение) почти всё работает как из пушки.
...
Рейтинг: 0 / 0
Как консольному app выполнить действия при получении консолью WM_CLOSE (нажать крестик)?
    #38633954
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovP.S. Вообще, конечно, забавно.
Написание частей, требуемых для работой сервисом собственного приложения, выглядит сравнимым по сложности с теми усилиями, которые предприняты для того, чтобы заставить работать своё приложение под чужим сервисом-обёрткой
А с чего ты взял что озвученная задача имеет отношение к "чтобы заставить работать своё приложение под чужим сервисом-обёрткой ".
Задачу "сервиса" я давно и успешно решил 5 лет назад.

Ну, маленький ньюанс с CTRL_LOGOFF_EVENT, "чтоб совсем хорошо было".
К слову скажем, в существующем порно-варианте с переброской пары-файлов туда-сюда, что я приводил:
Код: plaintext
1.
2.
3.
4.
5.
6.
    if( (_access( "stop.ext", 0 )) != -1 ){
      DeleteFile("stop.ext");
      manager->DetachEndPoint("myendpoint");
      ofstream outfile("stopped.ext");
      outfile.close();
    }


событие logoff вообще никак не учитывается.

Это уж я блеск навожу.
...
Рейтинг: 0 / 0
Как консольному app выполнить действия при получении консолью WM_CLOSE (нажать крестик)?
    #38633956
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКроме exit()/atexit() есть ещё abort().
Есть, соответственно и два сигнала - SIG_TERM и SIG_KILL. С названиями могу и ошибиться, но смысл понятен. Ну и ещё SIG_HUP.
Это уже пошел чистый C++. Не готов экспериментировать.
Мне хватает Opal-а с его мьютексами и заумностями, все ради кроссплатформенности.
Честно говоря, WIN API я больше доверяю.
...
Рейтинг: 0 / 0
Как консольному app выполнить действия при получении консолью WM_CLOSE (нажать крестик)?
    #38633958
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Это уже пошел чистый C++Отнюдь. Чистый цэ-рантайм.
...
Рейтинг: 0 / 0
Как консольному app выполнить действия при получении консолью WM_CLOSE (нажать крестик)?
    #38633959
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКошерный сервис-обёртка должен выдать сигнал мягкого завершения, выждать и только потом пристреливать зависшее приложение.Если NSSM "стреляет без предупреждения", то он тоже сосёт.

Так я ж привел, как он завершает:
Service shutdownFirst nssm will attempt to generate a Control-C event and send it to the application's console. Batch scripts or console applications may intercept the event and shut themselves down gracefully. Java applications tend to respond well to Control-C events. GUI applications do not have consoles and will not respond to this method. Not supported on Windows 2000.

Secondly nssm will enumerate all windows created by the application and send them a WM_CLOSE message. Applications may follow the convention of responding to the message by initiating a graceful exit.

Thirdly nssm will enumerate all threads created by the application and send them a WM_QUIT message, which will be received if the application has a thread message queue

As a last resort nssm can call TerminateProcess() to request that the operating system forcibly terminate the application. The TerminateProcess() call cannot be trapped or ignored, so in most circumstances the application will be killed. However, it is unlikely that it will be able to perform any cleanup operations before it exits.

Че, жестко?
Я недавно "обновлял", последняя версия завершает четко.
В версии NSSM 5-летней давности приложение "почему-то могло не завершиться" (возможно в силу каких-то мягкостей), подробности не копал.
...
Рейтинг: 0 / 0
Как консольному app выполнить действия при получении консолью WM_CLOSE (нажать крестик)?
    #38633960
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovОтнюдь. Чистый цэ-рантайм.
Ну, что тебе сказать. Религия у каждого своя, я вон даже C от C++ не особо отличаю. C-шные ф-ции с 10-ю подчеркиваниями это нечто.
...
Рейтинг: 0 / 0
Как консольному app выполнить действия при получении консолью WM_CLOSE (нажать крестик)?
    #38633964
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abort() :
In both retail and debug builds, abort then checks whether an abort signal handler is set. If a non-default signal handler is set, abort calls raise(SIGABRT). Use the signal function to associate an abort signal handler function with the SIGABRT signal. You can perform custom actions—for example, clean up resources or log information—and terminate the app with your own error code in the handler function. If no custom signal handler is defined, abort does not raise the SIGABRT signal.
Соответственно atexit() и signal() должны зарегистрировать одну и ту же функцию-обработчик.
Тогда завершающая подчистка будет делаться корректно, вне зависимости от способа завершения.
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как консольному app выполнить действия при получении консолью WM_CLOSE (нажать крестик)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]