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

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

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

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

Сообщение Andreich » 24.02.2011 10:15:31

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

Нужно каким-то образом отловить момент, когда предпринимается попытка выключения, быстренько отправить данные и изменить статус на offlinе. Честно говоря у меня никаких мыслей или идей нет, а поиск предлагает только программно выключать ПК. Может кто что подскажет? Заранее спасибо за любые идеи или предложения.
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

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

Сообщение dunin » 24.02.2011 11:26:19

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

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

Сообщение Maxizar » 24.02.2011 12:47:37

В 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.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

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

Сообщение hinst » 24.02.2011 12:52:56

При первом запуске вашего приложения под линухом показывайте юзверю сообщение большими буквами и с восклицательным знаком во весь экран: перед выключением компьютера нажмите в приложении Quit во избежание потери данных :D
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

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

Сообщение bw » 24.02.2011 14:00:24

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

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

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

Сообщение dunin » 24.02.2011 14:00:38

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

Шедеврально!!! :mrgreen:
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

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

Сообщение Сквозняк » 25.02.2011 02:04:18

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

Если пользователь отключит компьютер выдёргиванием вилки из розетки или ресетом, в линуксе это не очень страшно, или пропадёт электричество, то попытка "быстренько отправить данные" может привести к порче этих данных. Например, наступило утро, захотелось спать, хрясь на ресет+вилку и быстро спать - дорога каждая секунда сна! Проще делать бекап раз в несколько секунд. Когда связь разрывается надолго, выставлять статус offline. И если при последующем соединении коннектящаяся программа сообщит что сеанс новый, считать данные полученные после бекапирования недействительными.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

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

Сообщение Andreich » 25.02.2011 11:16:51

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

Сейчас попробую реализовать вариант предложенный Maxizar. Есть лишь один вопрос, что за модуль такой LMessages?
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

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

Сообщение WAYFARER » 25.02.2011 16:26:55

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


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 16

Рейтинг@Mail.ru