Как определить момент выключения ПК?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Andreich
постоялец
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Как определить момент выключения ПК?

Сообщение Andreich »

Всем привет! Возникла такая вот задача: программа работает в фоновом режиме и в с некоторой периодичностью отправляет данные на сервер, а также параллельно подтверждает свой статус (online/offline). Проблема в том, что если пользователь отправляет компьютер в перезагрузку или просто его выключает, то на сервере остаются данные о последнем состоянии... т.е. компьютер уже давно выключен, а в базе до сих пор висит что программа в сети и активна!

Нужно каким-то образом отловить момент, когда предпринимается попытка выключения, быстренько отправить данные и изменить статус на offlinе. Честно говоря у меня никаких мыслей или идей нет, а поиск предлагает только программно выключать ПК. Может кто что подскажет? Заранее спасибо за любые идеи или предложения.
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Для виндуса в сети полно примеров на Delphi. А вот как под линуксом... :|
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

В Windows приходит сообщение WM_QUERYENDSESSION с lParam=0.
Для Linux, Я не знаю :oops: , может это сообщение тоже есть.
Как отловить скажем в форме, делаем так:

Код: Выделить всё

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.
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

При первом запуске вашего приложения под линухом показывайте юзверю сообщение большими буквами и с восклицательным знаком во весь экран: перед выключением компьютера нажмите в приложении Quit во избежание потери данных :D
Аватара пользователя
bw
постоялец
Сообщения: 359
Зарегистрирован: 01.12.2005 10:36:23
Откуда: Усть-Илимск
Контактная информация:

Сообщение bw »

Сигналы никто не отменял, например SIGTERM:
$ man 7 signal

..bw
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

hinst писал(а):При первом запуске вашего приложения под линухом показывайте юзверю сообщение большими буквами и с восклицательным знаком во весь экран: перед выключением компьютера нажмите в приложении Quit во избежание потери данных :D

Шедеврально!!! :mrgreen:
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Andreich писал(а):Нужно каким-то образом отловить момент, когда предпринимается попытка выключения, быстренько отправить данные и изменить статус на offlinе.

Если пользователь отключит компьютер выдёргиванием вилки из розетки или ресетом, в линуксе это не очень страшно, или пропадёт электричество, то попытка "быстренько отправить данные" может привести к порче этих данных. Например, наступило утро, захотелось спать, хрясь на ресет+вилку и быстро спать - дорога каждая секунда сна! Проще делать бекап раз в несколько секунд. Когда связь разрывается надолго, выставлять статус offline. И если при последующем соединении коннектящаяся программа сообщит что сеанс новый, считать данные полученные после бекапирования недействительными.
Andreich
постоялец
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Сообщение Andreich »

Да, идея с большим предупреждением по центру экрана - это прикольно! :)
Выдергивание шнура из розетки,.. маловероятно, т.к. все машинки подключены через бесперебойники.

Сейчас попробую реализовать вариант предложенный Maxizar. Есть лишь один вопрос, что за модуль такой LMessages?
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 564
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

Как вариант пусть клиент через определенный промежуток времени шлет пакеты серверу. Сервер, не получив пакета за определенный промежуток времени
изменяет статус на офлайн.
Ответить