#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
.
Эта функция устанавливает порядок завершения работы для процесса относительно других процессов в системе.