Recent

Author Topic: Cancelar a aplicação Lazarus com CTLR+C  (Read 3600 times)

automacaosamos

  • New Member
  • *
  • Posts: 21
Cancelar a aplicação Lazarus com CTLR+C
« on: November 11, 2021, 02:54:00 pm »
Bom dia fiz o código abaixo  usando o Simple Program

ele funciona perfeitamente mas quando tento encerrar com o CTRL + C

ele da a mensagem: Project raised exception class 'External: SIGINT'. At address 7703B095

o que poderia ser ??
Code: Pascal  [Select][+][-]
  1. program apisamos;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses
  6.   {$IFDEF UNIX}{$IFDEF UseCThreads}
  7.   cthreads,
  8.   {$ENDIF}{$ENDIF}
  9.   SysUtils,
  10.   Classes,
  11.   fphttpapp,
  12.   httpdefs,
  13.   httproute,
  14.   fpjson,
  15.   jsonparser;
  16.  
  17. procedure jsonResponse(var res: TResponse; data: String);
  18. begin
  19.   res.Content       := data;
  20.   res.Code          := 200;
  21.   res.ContentType   := 'application/json';
  22.   res.ContentLength := length(res.Content);
  23.   res.SendContent;
  24. end;
  25.  
  26. procedure timeEndpoint(req: TRequest; res: TResponse);
  27. var
  28.   jObject : TJSONObject;
  29. begin
  30.   jObject := TJSONObject.Create;
  31.   try
  32.     jObject.Strings['time'] := 'Servidor OK ' + TimeToStr(Time) + req.URI;
  33.     jsonResponse(res, jObject.AsJSON);
  34.   finally
  35.     jObject.Free;
  36.   end;
  37. end;
  38.  
  39. procedure apiEndpoint(req: TRequest; res: TResponse);
  40. var
  41.   JSONObject            : TJSONObject;
  42.   Rota                  : String;
  43.   Metodo                : String;
  44.   Uri                   : String;
  45. begin
  46.   req.RouteParams[''];
  47.   Metodo        := req.Method;
  48.   Rota          := req.RouteParams['name'];
  49.   Uri           := req.URI;
  50.   JSONObject    := TJSONObject.Create;
  51.   JSONObject    := TJSONObject(GetJSON('{"teste":"ok"}'));
  52.   JSONResponse(res, JSONObject.AsJSON);
  53.  
  54. end;
  55.  
  56. begin
  57.   Application.Port     := 8080;
  58.   HTTPRouter.RegisterRoute('/time'     , @timeEndpoint, true);
  59.   HTTPRouter.RegisterRoute('/api/:name', @apiEndpoint);
  60.   Application.Threaded := true;
  61.   writeln('Servidor Rodando: http://localhost:' + IntToStr(Application.Port) + '/time');
  62.   Application.Initialize;
  63.   Application.Run;
  64. end.                                            
  65.  
« Last Edit: November 11, 2021, 03:01:13 pm by automacaosamos »

Gustavo 'Gus' Carreno

  • Hero Member
  • *****
  • Posts: 1120
  • Professional amateur ;-P
Re: Cancelar a aplicação Lazarus com CTLR+C
« Reply #1 on: November 11, 2021, 06:48:45 pm »
Oies,

Por defeito os sinais não têm uma rotina que faça com que a mensagem desse sinal seja mais humana.

Pelo facto de que estamos a falar da linguagem Object Pascal, qualquer erro normalmente é transmitido como uma Exceção.

Neste caso, quando se tenta encerrar o programa com CTRL+C, o que é enviado para a aplicação é o sinal SIGINT ou Interrupt Signal.

A maneira que a linguagem tem de anunciar que detetou o envio do sinal SIGINT é pelo mecanismo de exceções, e é isso mesmo que encontrou.

Espero que faça sentido... Após uma porrada de anos no Reino Unido, o cérebro começa a pensar mais em Inglês que em Tuga e, por incrivel que pareça, custou-me bastante articular isto em Português, mais do que eu gostaria de admitir, LOL!!

Grande abraço,
Gus
Lazarus 3.99(main) FPC 3.3.1(main) Ubuntu 23.10 64b Dark Theme
Lazarus 3.0.0(stable) FPC 3.2.2(stable) Ubuntu 23.10 64b Dark Theme
http://github.com/gcarreno

 

TinyPortal © 2005-2018