Как определить момент выключения ПК?
Модератор: Модераторы
Как определить момент выключения ПК?
Всем привет! Возникла такая вот задача: программа работает в фоновом режиме и в с некоторой периодичностью отправляет данные на сервер, а также параллельно подтверждает свой статус (online/offline). Проблема в том, что если пользователь отправляет компьютер в перезагрузку или просто его выключает, то на сервере остаются данные о последнем состоянии... т.е. компьютер уже давно выключен, а в базе до сих пор висит что программа в сети и активна!
Нужно каким-то образом отловить момент, когда предпринимается попытка выключения, быстренько отправить данные и изменить статус на offlinе. Честно говоря у меня никаких мыслей или идей нет, а поиск предлагает только программно выключать ПК. Может кто что подскажет? Заранее спасибо за любые идеи или предложения.
Нужно каким-то образом отловить момент, когда предпринимается попытка выключения, быстренько отправить данные и изменить статус на offlinе. Честно говоря у меня никаких мыслей или идей нет, а поиск предлагает только программно выключать ПК. Может кто что подскажет? Заранее спасибо за любые идеи или предложения.
В Windows приходит сообщение WM_QUERYENDSESSION с lParam=0.
Для Linux, Я не знаю
, может это сообщение тоже есть.
Как отловить скажем в форме, делаем так:
Для Linux, Я не знаю
Как отловить скажем в форме, делаем так:
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
Messages,LMessages;
type
{ TForm1 }
TForm1 = class(TForm)
private
{ private declarations }
procedure PowerOff(var Mes: TMessage); message WM_QUERYENDSESSION;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.PowerOff(var Mes: TMessage);
begin
if Mes.lParam:=0 then //ПК выключают
begin
делаем что нам нужно, желательно быстро.
end;
end;
end.
При первом запуске вашего приложения под линухом показывайте юзверю сообщение большими буквами и с восклицательным знаком во весь экран: перед выключением компьютера нажмите в приложении Quit во избежание потери данных 
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
hinst писал(а):При первом запуске вашего приложения под линухом показывайте юзверю сообщение большими буквами и с восклицательным знаком во весь экран: перед выключением компьютера нажмите в приложении Quit во избежание потери данных
Шедеврально!!!
Andreich писал(а):Нужно каким-то образом отловить момент, когда предпринимается попытка выключения, быстренько отправить данные и изменить статус на offlinе.
Если пользователь отключит компьютер выдёргиванием вилки из розетки или ресетом, в линуксе это не очень страшно, или пропадёт электричество, то попытка "быстренько отправить данные" может привести к порче этих данных. Например, наступило утро, захотелось спать, хрясь на ресет+вилку и быстро спать - дорога каждая секунда сна! Проще делать бекап раз в несколько секунд. Когда связь разрывается надолго, выставлять статус offline. И если при последующем соединении коннектящаяся программа сообщит что сеанс новый, считать данные полученные после бекапирования недействительными.
Да, идея с большим предупреждением по центру экрана - это прикольно!
Выдергивание шнура из розетки,.. маловероятно, т.к. все машинки подключены через бесперебойники.
Сейчас попробую реализовать вариант предложенный Maxizar. Есть лишь один вопрос, что за модуль такой LMessages?
Выдергивание шнура из розетки,.. маловероятно, т.к. все машинки подключены через бесперебойники.
Сейчас попробую реализовать вариант предложенный Maxizar. Есть лишь один вопрос, что за модуль такой LMessages?
Как вариант пусть клиент через определенный промежуток времени шлет пакеты серверу. Сервер, не получив пакета за определенный промежуток времени
изменяет статус на офлайн.
изменяет статус на офлайн.
