Ctrl-C

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

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

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

Сообщение STAKANOV »

Есть ли у нас способ кроссплатформенно перехватить Ctrl-C ?
Yurik
незнакомец
Сообщения: 5
Зарегистрирован: 22.12.2009 20:15:19

Сообщение Yurik »

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

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

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

Сообщение hinst »

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

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

Сообщение Сквозняк »

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.
Ответить