Отловить завершение работы, и завершение сеанса в линукс.
Модератор: Модераторы
Отловить завершение работы, и завершение сеанса в линукс.
Есть SuSe 11.2
Lazarus 0.9.28.2
Надо перехватить завершение сеанса и завершение работы в SuSe, примеры из Виндовс естественно не помогают.
Если можно то напишите пример..
Lazarus 0.9.28.2
Надо перехватить завершение сеанса и завершение работы в SuSe, примеры из Виндовс естественно не помогают.
Если можно то напишите пример..
В Линуксе программы имеют 2 вида убивания: TERM и KILL. Процессы, запущенные в сеансе пользователя, при завершении сеанса получают команду TERM. Если за определенное время они не успели завершиться - KILL. То есть надо тебе обрабатывать именно TERM, иначе твоя программа просто будет убита командой KILL. 
Реализацию в Лазарусе не пробовал делать, но можешь попробовать обработать событие OnDestroy из главной формы.
Добавлено спустя 1 час 7 минут 26 секунд:
Хм... Я чет сейчас попробовал и нифига OnDestroy не обрабатывается... Просто убивается программа и все...
Добавлено спустя 45 минут 59 секунд:
Хм... Отловил событие SIGTERM, но при завершении сеанса оно не срабатывает... похоже все таки программа убивается SIGKILL'ом... Ща пробую
Добавлено спустя 47 минут 7 секунд:
Да уж... Не знаю даже, чей косяк... У меня стоит Gnome 2.28. При закрытии сеанса он просто тупо убивает себя и все программы SIGKILL'ом, который отловить не представляется возможным...
Не знаю, как обстоят дела с KDE, пробовать неохота, больно много места занимает. Сейчас хочу попробовать Xfce4, посмотрю что можно в нем сделать
Реализацию в Лазарусе не пробовал делать, но можешь попробовать обработать событие OnDestroy из главной формы.
Добавлено спустя 1 час 7 минут 26 секунд:
Хм... Я чет сейчас попробовал и нифига OnDestroy не обрабатывается... Просто убивается программа и все...
Добавлено спустя 45 минут 59 секунд:
Хм... Отловил событие SIGTERM, но при завершении сеанса оно не срабатывает... похоже все таки программа убивается SIGKILL'ом... Ща пробую
Добавлено спустя 47 минут 7 секунд:
Да уж... Не знаю даже, чей косяк... У меня стоит Gnome 2.28. При закрытии сеанса он просто тупо убивает себя и все программы SIGKILL'ом, который отловить не представляется возможным...
Не знаю, как обстоят дела с KDE, пробовать неохота, больно много места занимает. Сейчас хочу попробовать Xfce4, посмотрю что можно в нем сделать
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Чтобы обработать завершение сеанса (и не только), графическая программа должна взаимодействовать с диспетчером сеансов (session manager) по соотвествующему протоколу: www.xfree86.org/current/xsmp.pdf
Этот протокол наверняка реализован и в gtk, и в qt. Если в LCL нет поддержки, это повод для багрепорта.
Этот протокол наверняка реализован и в gtk, и в qt. Если в LCL нет поддержки, это повод для багрепорта.
/fixed

Sergei I. Gorelkin писал(а):Этот протокол наверняка реализован и в gtk, и в qt. Если в LCL нет поддержки, это повод для основательного изучения реализации обеих библиотек, а также внесения необходимых правок в LCL с патчем в багрепорт Лазаря.
Application.OnEndSession, Application.OnQueryEndSession ?
эмм... как реализовать в коде?
Код: Выделить всё
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;
...
Спасибо огромное!
Буду пробовать 
Добавлено спустя 1 час 2 минуты 11 секунд:
Через TApplicationProperties, используя OnQueryEndSession, не работает... Вылетает вместе с завершением сеанса не спрашивая ничего...
Добавлено спустя 1 час 9 минут 18 секунд:
И с помощью ручной прописи тоже не работает...
Вот мой код:
Добавлено спустя 26 минут 2 секунды:
Не работает никак... Буду искать в исходниках Лазаруса....
Добавлено спустя 48 минут 26 секунд:
Хех
Лазарус во время отладки также тупо убился при завершении сеанса 
Добавлено спустя 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 секунд:
Хех
