Поддерживать процесс в рабочем состоянии во время завершения работы

#windows #winapi #visual-c

#Windows #winapi #visual-c

Вопрос:

У меня есть два настольных приложения на одном компьютере, давайте назовем их клиентом и сервером. Когда Windows переходит в режим завершения работы, я хотел бы, чтобы клиент провел небольшую уборку с сервером. Клиент знает, что это время закрытия, потому что в OnFormClosing FormClosingEventArgs.CloseReason is CloseReason.WindowsShutDown . Но в то же время сервер может быть принудительно убит операционной системой. Возможно ли, чтобы сервер работал как можно дольше, чтобы все клиенты могли завершить свою работу, но не полностью остановить завершение работы?

  • Сервер не знает, какие клиенты активны и нуждаются в уборке.
  • Как клиент, так и сервер не должны вызывать отображение в Windows сообщения о том, что приложение предотвращает завершение работы Windows.

Я предполагаю, что я прошу некоторые вызовы Windows API, которые могут согласовывать с Windows, чтобы завершить процесс последним, если это возможно, но приветствуется любое рабочее решение. Клиент написан на C #, а Сервер написан на C .

Комментарии:

1. Сделайте сервер службой.

2. @Dialecticus опубликован ответ

Ответ №1:

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

Когда сервер получит уведомление о неизбежном завершении работы, попросите его вызвать ShutdownBlockReasonCreate() , если подключены какие-либо клиенты. Независимо от того, выполняют ли клиенты домашнюю уборку или нет, когда последний клиент отключается, сервер может вызвать ShutdownBlockReasonDestroy() .

Ответ №2:

Очевидное решение — сделать сервер службой Windows.

В качестве временного решения вы можете попробовать SetProcessShutdownParameters .

Эта функция устанавливает порядок завершения работы для процесса относительно других процессов в системе.