Ctrl-C
Модератор: Модераторы
Вопрос актуален. Что-то же наверняка изменилось с 2005 года?
Я нашел функцию SysSetCtrlBreakHandler, но по всей видимости она не работает.
Может быть, что-то еще есть?
Можно немного переформулировать вопрос: как освободить ресурсы или закрыть все открытые соединения с БД, если пользователь завершает программу с помощью Ctrl+C, Ctrl+Break или еще как-то. Неужели никак нельзя это дело перехватить?
Я нашел функцию SysSetCtrlBreakHandler, но по всей видимости она не работает.
Может быть, что-то еще есть?
Можно немного переформулировать вопрос: как освободить ресурсы или закрыть все открытые соединения с БД, если пользователь завершает программу с помощью Ctrl+C, Ctrl+Break или еще как-то. Неужели никак нельзя это дело перехватить?
надо в README.TEXT написать большими буквами "Юзверь! Если не хочешь, чтобы твои данные заспойлерились... после чего ты потеряешь возможность их восстановить без помощи админа. Не завершай процесс Ctrl+C, Ctrl+Break, Ctrl+Alt+Delete, не нажимай Reset, не делай Kill, не выдёргивай шнур питания компа из розетки электросети. Не применяй экстерминатус, в конце концов...
Ну а так вообще, вы видели, чтобы хоть одна программа перехватывала Ctrl+C ??? Ctrl+C он на то и Ctrl+C, чтобы повисшую прогу завершить ко всем. Так что, какой смысл делать по дефолту возможность ещё вешать на неё обработчик?? если она повисла до абсолютно невменяемого состояния, её обработчик ничем тут не поможет
Ну а так вообще, вы видели, чтобы хоть одна программа перехватывала Ctrl+C ??? Ctrl+C он на то и Ctrl+C, чтобы повисшую прогу завершить ко всем. Так что, какой смысл делать по дефолту возможность ещё вешать на неё обработчик?? если она повисла до абсолютно невменяемого состояния, её обработчик ничем тут не поможет
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.
