Страница 1 из 1
Отловить завершение работы, и завершение сеанса в линукс.
Добавлено: 01.03.2010 14:20:51
the_bmw
Есть SuSe 11.2
Lazarus 0.9.28.2
Надо перехватить завершение сеанса и завершение работы в SuSe, примеры из Виндовс естественно не помогают.
Если можно то напишите пример..
Re: Отловить завершение работы, и завершение сеанса в линукс.
Добавлено: 22.03.2010 15:20:40
eevee
В Линуксе программы имеют 2 вида убивания: TERM и KILL. Процессы, запущенные в сеансе пользователя, при завершении сеанса получают команду TERM. Если за определенное время они не успели завершиться - KILL. То есть надо тебе обрабатывать именно TERM, иначе твоя программа просто будет убита командой KILL.

Реализацию в Лазарусе не пробовал делать, но можешь попробовать обработать событие OnDestroy из главной формы.
Добавлено спустя 1 час 7 минут 26 секунд:Хм... Я чет сейчас попробовал и нифига OnDestroy не обрабатывается... Просто убивается программа и все...
Добавлено спустя 45 минут 59 секунд:Хм... Отловил событие SIGTERM, но при завершении сеанса оно не срабатывает... похоже все таки программа убивается SIGKILL'ом... Ща пробую
Добавлено спустя 47 минут 7 секунд:Да уж... Не знаю даже, чей косяк... У меня стоит Gnome 2.28. При закрытии сеанса он просто тупо убивает себя и все программы SIGKILL'ом, который отловить не представляется возможным...
Не знаю, как обстоят дела с KDE, пробовать неохота, больно много места занимает. Сейчас хочу попробовать Xfce4, посмотрю что можно в нем сделать
Re: Отловить завершение работы, и завершение сеанса в линукс.
Добавлено: 22.03.2010 21:54:17
Sergei I. Gorelkin
Чтобы обработать завершение сеанса (и не только), графическая программа должна взаимодействовать с диспетчером сеансов (session manager) по соотвествующему протоколу:
www.xfree86.org/current/xsmp.pdfЭтот протокол наверняка реализован и в gtk, и в qt. Если в LCL нет поддержки, это повод для багрепорта.
Re: Отловить завершение работы, и завершение сеанса в линукс.
Добавлено: 22.03.2010 23:53:06
скалогрыз
/fixed
Sergei I. Gorelkin писал(а):Этот протокол наверняка реализован и в gtk, и в qt. Если в LCL нет поддержки, это повод для основательного изучения реализации обеих библиотек, а также внесения необходимых правок в LCL с патчем в багрепорт Лазаря.

Re: Отловить завершение работы, и завершение сеанса в линукс.
Добавлено: 23.03.2010 11:00:52
v-t-l
Application.OnEndSession, Application.OnQueryEndSession ?
Re: Отловить завершение работы, и завершение сеанса в линукс.
Добавлено: 23.03.2010 11:29:28
eevee
эмм... как реализовать в коде?
Re: Отловить завершение работы, и завершение сеанса в линукс.
Добавлено: 23.03.2010 16: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

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

Re: Отловить завершение работы, и завершение сеанса в линукс.
Добавлено: 24.03.2010 11:16:16
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 секунд:Хех

Лазарус во время отладки также тупо убился при завершении сеанса
