Ctrl-C

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Сообщение STAKANOV » 22.10.2005 16:17:25

Есть ли у нас способ кроссплатформенно перехватить Ctrl-C ?
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Re: Ctrl-C

Сообщение Yurik » 17.11.2010 10:07:01

Вопрос актуален. Что-то же наверняка изменилось с 2005 года?

Я нашел функцию SysSetCtrlBreakHandler, но по всей видимости она не работает.
Может быть, что-то еще есть?

Можно немного переформулировать вопрос: как освободить ресурсы или закрыть все открытые соединения с БД, если пользователь завершает программу с помощью Ctrl+C, Ctrl+Break или еще как-то. Неужели никак нельзя это дело перехватить?
Yurik
незнакомец
 
Сообщения: 5
Зарегистрирован: 22.12.2009 21:15:19

Re: Ctrl-C

Сообщение hinst » 17.11.2010 23:46:05

надо в README.TEXT написать большими буквами "Юзверь! Если не хочешь, чтобы твои данные заспойлерились... после чего ты потеряешь возможность их восстановить без помощи админа. Не завершай процесс Ctrl+C, Ctrl+Break, Ctrl+Alt+Delete, не нажимай Reset, не делай Kill, не выдёргивай шнур питания компа из розетки электросети. Не применяй экстерминатус, в конце концов...

Ну а так вообще, вы видели, чтобы хоть одна программа перехватывала Ctrl+C ??? Ctrl+C он на то и Ctrl+C, чтобы повисшую прогу завершить ко всем. Так что, какой смысл делать по дефолту возможность ещё вешать на неё обработчик?? если она повисла до абсолютно невменяемого состояния, её обработчик ничем тут не поможет
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Ctrl-C

Сообщение Сквозняк » 18.11.2010 11:23:22

hinst писал(а):надо в README.TEXT написать большими буквами "Юзверь! Если не хочешь, чтобы твои данные заспойлерились... после чего ты потеряешь возможность их восстановить без помощи админа. Не завершай процесс Ctrl+C, Ctrl+Break, Ctrl+Alt+Delete, не нажимай Reset, не делай Kill, не выдёргивай шнур питания компа из розетки электросети.

Ключевой слово "юзверь", а для не юзверей написать: если ты не хочешь чтобы обезумевшая система забила сохранку мусором, нажми ресет в нужный момент. Так может быть удастся минимизировать потери.

hinst писал(а):Ну а так вообще, вы видели, чтобы хоть одна программа перехватывала Ctrl+C ???

Код: Выделить всё
program demo2;

uses
SDL,  crt;

const
width = 320{1024};
height = 240{768};
colordepth = {16}32;

var
Q8,W8: word;
screen: PSDL_Surface;
event: PSDL_Event;
done: Boolean;
Type
TpixelBuf = Array [0..height-1, 0..width-1] of longword;


PROCEDURE FGYIU;
var
Q2,W2: longint;
CVET: longword;
begin
CVET:=SDL_MapRGB(screen^.format,255,255,255);
for Q2:=0 to height-1 do for W2:=0 to width-1 do Tpixelbuf(screen^.pixels^)[Q2,W2]:=CVET;
SDL_UpdateRect(screen,0,0,0,0);
delay(500);
CVET:=SDL_MapRGB(screen^.format,0,0,0);
for Q2:=0 to height-1 do for W2:=0 to width-1 do Tpixelbuf(screen^.pixels^)[Q2,W2]:=CVET;
SDL_UpdateRect(screen,0,0,0,0);
delay(100);
end;



begin
SDL_Init(SDL_INIT_VIDEO);
event := new(PSDL_Event);
screen := SDL_SetVideoMode(width, height, colordepth,{SDL_FULLSCREEN +} SDL_SWSURFACE + SDL_ANYFORMAT + SDL_DOUBLEBUF);
if screen = nil then begin
                     writeLn ('Couldn''t initialize video mode at ', width, 'x', height, 'x', colordepth, 'bpp');
                     halt(1);
                     end;

done:= FALSE;
delay(1000);
Q8:=0;
while (done = FALSE) do
begin
SDL_PumpEvents;
if (SDL_PollEvent(event) > 0) then
  CASE event^.type_ OF
  SDL_QUITEV: done:= TRUE;
  SDL_KEYDOWN: CASE EVENT^.KEY.keysym.SYM OF
               SDLK_LCTRL,SDLK_RCTRL: CASE Q8 of
                                      0:  Q8:=1;
                                      1:  Q8:=2;
                                      10: Q8:=14;
                                      end;
               SDLK_C: CASE Q8 OF
                       1,2: Q8:=14;
                       0:   Q8:=10;
                       end;
               end;
  SDL_KEYUP: CASE EVENT^.KEY.keysym.SYM OF
             SDLK_LCTRL,SDLK_RCTRL: CASE Q8 of
                                    1,2: Q8:=Q8-1;
                                    end;
             SDLK_C: if Q8>2 then Q8:=0;
             end;
  end;
if Q8>13 then begin
              FGYIU;
              Q8:=1;
              SDL_PumpEvents;
              end;
DELAY(1);
end;
SDL_Quit ;
end.
Сквозняк
энтузиаст
 
Сообщения: 1126
Зарегистрирован: 29.06.2006 22:08:32


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru