Lazarus

Other Languages => Portuguese => Topic started by: automacaosamos on November 11, 2021, 02:54:00 pm

Title: Cancelar a aplicação Lazarus com CTLR+C
Post by: automacaosamos 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.  
Title: Re: Cancelar a aplicação Lazarus com CTLR+C
Post by: Gustavo 'Gus' Carreno 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
TinyPortal © 2005-2018