RTC Forums

Subscription => Support => Topic started by: nusret on May 14, 2018, 11:14:35 AM



Title: RtcHttpClient: Computer exiting sleep mode then application not response
Post by: nusret on May 14, 2018, 11:14:35 AM
Wait few minutes  in sleep mode, exiting sleep mode then application is not response.


Title: Re: RtcHttpClient: Computer exiting sleep mode then application not response
Post by: D.Tkalcec (RTC) on May 14, 2018, 11:23:23 AM
Please, provide more information and some example code.


Title: Re: RtcHttpClient: Computer exiting sleep mode then application not response
Post by: nusret on May 14, 2018, 12:49:57 PM
unit Unit1;

interface

uses
  Winapi.Windows,
  Winapi.Messages,

  System.SysUtils,
  System.Variants,
  System.Classes,

  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls,

  rtcConn,
  rtcDataCli,
  rtcHttpCli,
  rtcSystem,
  rtcTimer
  ;

type
  TfrmClient = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);

  private
    { Private declarations }
    FClient: TRtcHttpClient;
    FDataRq: TRtcDataRequest;
    FConnLost,
    FConnBusy: boolean;
    FtmLastPing: Cardinal;
    FPingTimer: TRtcTimer;


    procedure DataRq_OnBeginRequest(Sender: TRtcConnection);
    procedure DataRq_OnDataReceived(Sender: TRtcConnection);
    procedure DataRq_OnResponseAbort(Sender: TRtcConnection);

    procedure DoConnect;
    procedure DoConnLost(Sender: TRtcConnection);
    procedure DoPing;

  public
    { Public declarations }

  end;

var
  frmClient: TfrmClient;

implementation

{$R *.dfm}

procedure TfrmClient.FormCreate(Sender: TObject);
  begin
    FClient := TRtcHttpClient.Create(nil);
    FDataRq := TRtcDataRequest.Create(nil);
    with FDataRq do
      begin
        AutoSyncEvents := True;
        Client := FClient;
        HyperThreading := True;
        OnBeginRequest := DataRq_OnBeginRequest;
        OnDataReceived := DataRq_OnDataReceived;
        OnResponseAbort := DataRq_OnResponseAbort;
      end;

    FClient.ServerAddr := '127.0.0.1';
    FClient.ServerPort := '8088';
    //FClient.MultiThreaded := True;
    FClient.AutoConnect := True;

    DoConnect;
  end;

procedure TfrmClient.FormDestroy(Sender: TObject);
  begin
    if Assigned(FPingTimer) then
      TRtcTimer.Stop(FPingTimer);
    FreeAndNil(FClient);
  end;

procedure TfrmClient.DataRq_OnBeginRequest(Sender: TRtcConnection);
  var
    Cli: TRtcDataClient absolute Sender;
  begin
    if FConnLost then
      exit;

    if Cli.Request.FileName = '/ping' then
      Cli.Write;
  end;

procedure TfrmClient.DataRq_OnDataReceived(Sender: TRtcConnection);
  var
    Cli: TRtcDataClient absolute Sender;
    Dt: RtcByteArray;
  begin
    if FConnLost then
      exit;

    if Cli.Response.StatusCode <> 200 then
      DoConnLost(Sender)
    else
    if Cli.Response.Done then
      begin
        Dt := Cli.ReadEx;
        FtmLastPing := GetTickCount;
        FConnBusy := False;
      end;
  end;

procedure TfrmClient.DataRq_OnResponseAbort(Sender: TRtcConnection);
  var
    Cli: TRtcDataClient absolute Sender;
  begin
    Cli.Request.Skip;
    DoConnLost(Sender);
  end;

procedure TfrmClient.DoConnect;
  begin
    if not Assigned(FPingTimer) then
      begin
        FPingTimer := TRtcTimer.Create(True);
        TRtcTimer.Enable(FPingTimer, 1000, DoPing);
      end;

    FConnLost := False;
    FConnBusy := False;

    DoPing;
  end;

procedure TfrmClient.DoConnLost(Sender: TRtcConnection);
  begin
    if FConnLost then
      exit;

    FConnLost := True;
    FClient.AutoConnect := False;
    //FClient.Disconnect;
    FClient.DisconnectNow(True);
    FClient.SkipRequests;

    FConnBusy := False;
    FtmLastPing := 0;
  end;

procedure TfrmClient.DoPing;
  begin
    if (FtmLastPing + (2*1000) > GetTickCount) or FConnBusy then
      Exit;

    FConnBusy := True;
    FtmLastPing := GetTickCount;
    FDataRq.Request.Method := 'GET';
    FDataRq.Request.FileName := '/ping';
    FDataRq.Post;
  end;

end.


Title: Re: RtcHttpClient: Computer exiting sleep mode then application not response
Post by: nusret on May 14, 2018, 12:51:56 PM
problem in DisconnectNow procedure.
(Sorry my english is very poor)


Title: Re: RtcHttpClient: Computer exiting sleep mode then application not response
Post by: D.Tkalcec (RTC) on May 14, 2018, 01:03:03 PM
You are calling "FClient.DisconnectNow" from inside several events triggered by the "FClient:TRtcHttpClient" component and/or linked components (like FDataReq). That is a definitive no-go. NEVER call "DisconnectNow" from inside ANY events triggered by RTC components, because this creates an endless loop inside the "DisconnectNow" event. If you need to signal the component to close a connection from inside a RTC event, you can use the "Disconnect" method, which returns immediately and handles the disconnect asynchronously after exiting the event.

The "DisconnectNow" method may ONLY be called from inside the Main Thread and ONLY from code triggered as a result of user interaction and/or messages received by the OS.


Title: Re: RtcHttpClient: Computer exiting sleep mode then application not response
Post by: nusret on May 14, 2018, 01:07:09 PM
Thank you.