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

Форум для изучающих FPC и их учителей.

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

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

Сообщение the_bmw » 01.03.2010 15:20:51

Есть SuSe 11.2
Lazarus 0.9.28.2

Надо перехватить завершение сеанса и завершение работы в SuSe, примеры из Виндовс естественно не помогают.
Если можно то напишите пример..
the_bmw
незнакомец
 
Сообщения: 1
Зарегистрирован: 26.02.2010 21:18:55

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

Сообщение eevee » 22.03.2010 13:40:08

В Линуксе программы имеют 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, посмотрю что можно в нем сделать
eevee
новенький
 
Сообщения: 63
Зарегистрирован: 29.12.2009 17:52:44
Откуда: Саратов

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

Сообщение Sergei I. Gorelkin » 22.03.2010 22:54:17

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

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

Сообщение скалогрыз » 23.03.2010 00:53:06

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


:D
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение v-t-l » 23.03.2010 12:00:52

Application.OnEndSession, Application.OnQueryEndSession ?
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение eevee » 23.03.2010 12:29:28

эмм... как реализовать в коде?
eevee
новенький
 
Сообщения: 63
Зарегистрирован: 29.12.2009 17:52:44
Откуда: Саратов

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

Сообщение v-t-l » 23.03.2010 17:44:22

Код: Выделить всё
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
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение NXP » 23.03.2010 23:35:51

Lazarus перехватывает сообщение о завершении сеанса и предотвращает завершение (только во время отладки).
Так что можно подсмотреть в исходниках :wink:
Аватара пользователя
NXP
постоялец
 
Сообщения: 187
Зарегистрирован: 02.01.2008 16:11:56
Откуда: Воронеж

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

Сообщение eevee » 24.03.2010 08:50:19

Спасибо огромное! :) Буду пробовать :)

Добавлено спустя 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
eevee
новенький
 
Сообщения: 63
Зарегистрирован: 29.12.2009 17:52:44
Откуда: Саратов


Вернуться в Обучение Free Pascal

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru