Страница 1 из 1

Отловить завершение работы, и завершение сеанса в линукс.

СообщениеДобавлено: 01.03.2010 15:20:51
the_bmw
Есть SuSe 11.2
Lazarus 0.9.28.2

Надо перехватить завершение сеанса и завершение работы в SuSe, примеры из Виндовс естественно не помогают.
Если можно то напишите пример..

Re: Отловить завершение работы, и завершение сеанса в линукс.

СообщениеДобавлено: 22.03.2010 13:40:08
eevee
В Линуксе программы имеют 2 вида убивания: TERM и KILL. Процессы, запущенные в сеансе пользователя, при завершении сеанса получают команду TERM. Если за определенное время они не успели завершиться - KILL. То есть надо тебе обрабатывать именно TERM, иначе твоя программа просто будет убита командой KILL. :D

Реализацию в Лазарусе не пробовал делать, но можешь попробовать обработать событие OnDestroy из главной формы.

Добавлено спустя 1 час 7 минут 26 секунд:
Хм... Я чет сейчас попробовал и нифига OnDestroy не обрабатывается... Просто убивается программа и все...

Добавлено спустя 45 минут 59 секунд:
Хм... Отловил событие SIGTERM, но при завершении сеанса оно не срабатывает... похоже все таки программа убивается SIGKILL'ом... Ща пробую

Добавлено спустя 47 минут 7 секунд:
Да уж... Не знаю даже, чей косяк... У меня стоит Gnome 2.28. При закрытии сеанса он просто тупо убивает себя и все программы SIGKILL'ом, который отловить не представляется возможным...

Не знаю, как обстоят дела с KDE, пробовать неохота, больно много места занимает. Сейчас хочу попробовать Xfce4, посмотрю что можно в нем сделать

Re: Отловить завершение работы, и завершение сеанса в линукс.

СообщениеДобавлено: 22.03.2010 22:54:17
Sergei I. Gorelkin
Чтобы обработать завершение сеанса (и не только), графическая программа должна взаимодействовать с диспетчером сеансов (session manager) по соотвествующему протоколу: www.xfree86.org/current/xsmp.pdf
Этот протокол наверняка реализован и в gtk, и в qt. Если в LCL нет поддержки, это повод для багрепорта.

Re: Отловить завершение работы, и завершение сеанса в линукс.

СообщениеДобавлено: 23.03.2010 00:53:06
скалогрыз
/fixed
Sergei I. Gorelkin писал(а):Этот протокол наверняка реализован и в gtk, и в qt. Если в LCL нет поддержки, это повод для основательного изучения реализации обеих библиотек, а также внесения необходимых правок в LCL с патчем в багрепорт Лазаря.


:D

Re: Отловить завершение работы, и завершение сеанса в линукс.

СообщениеДобавлено: 23.03.2010 12:00:52
v-t-l
Application.OnEndSession, Application.OnQueryEndSession ?

Re: Отловить завершение работы, и завершение сеанса в линукс.

СообщениеДобавлено: 23.03.2010 12:29:28
eevee
эмм... как реализовать в коде?

Re: Отловить завершение работы, и завершение сеанса в линукс.

СообщениеДобавлено: 23.03.2010 17:44:22
v-t-l
Код: Выделить всё
TForm1=class(TForm)
  ...
  procedure FormCreate(Sender: TObject);
  ...
  procedure AppEndSession(Sender: TObject);
  ...
end;

...
implementation
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnEndSession := @AppEndSession;
end;

procedure TForm1.AppEndSesssion(Sender: TObject);
begin
  SohraniVse;
end;
...
Или просто воспользоваться TApplicationProperties со вкладки Additional :D

Re: Отловить завершение работы, и завершение сеанса в линукс.

СообщениеДобавлено: 23.03.2010 23:35:51
NXP
Lazarus перехватывает сообщение о завершении сеанса и предотвращает завершение (только во время отладки).
Так что можно подсмотреть в исходниках :wink:

Re: Отловить завершение работы, и завершение сеанса в линукс.

СообщениеДобавлено: 24.03.2010 08:50:19
eevee
Спасибо огромное! :) Буду пробовать :)

Добавлено спустя 1 час 2 минуты 11 секунд:
Через TApplicationProperties, используя OnQueryEndSession, не работает... Вылетает вместе с завершением сеанса не спрашивая ничего...

Добавлено спустя 1 час 9 минут 18 секунд:
И с помощью ручной прописи тоже не работает...

Вот мой код:
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure AppEndSession(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  f: text;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnEndSession := @AppEndSession;
end;

procedure TForm1.AppEndSession(Sender: TObject);
begin
  assignfile(f,'/home/eevee/123.321');
  rewrite(f);
  writeln(f,'Saved!');
  closefile(f);
end;

end.


Добавлено спустя 26 минут 2 секунды:
Не работает никак... Буду искать в исходниках Лазаруса....

Добавлено спустя 48 минут 26 секунд:
Хех :) Лазарус во время отладки также тупо убился при завершении сеанса :D