⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtcthrconnprov.pas

📁 Delphi快速开发Web Server
💻 PAS
字号:
{
  "Threaded Connection Provider wrapper" - Copyright (c) Danijel Tkalcec
  @html(<br>)

  @exclude
}

unit rtcThrConnProv;

{$INCLUDE rtcDefs.inc}

interface

uses
  Windows,

  rtcThrPool,

  rtcConnProv,
  rtcConnLimit;

type
  TRtcThrClientProvider = class(TRtcBasicClientProvider)
  protected
    function GetClientThread:TRtcThread; virtual; abstract;

  public
    procedure Release; override;

    function GetThread:TRtcThread; override;

    function inMainThread:boolean; override;
    function SyncEvent(Event:TRtcEvent):boolean; override;
    function inThread:boolean; override;

    function Pause:boolean; override;
    function Resume:boolean; override;

    function PostJob(Job:TObject; HighPriority:boolean):boolean; override;

    procedure Processing; override;

  (*** Methods that have to be implemented by the connection provider: *** ->

  protected
    procedure Enter; override;
    procedure Leave; override;

    function GetClientThread:TRtcThread; override;

  public
    procedure Connect(Force:boolean=False); override;
    procedure Disconnect; override;
    procedure InternalDisconnect; override;

    procedure Write(const s:string); override;
    function Read:string; override;

    <- *** end ***)
    end;

  TRtcNoThrClientProvider = class(TRtcBasicClientProvider)
  public
    function inMainThread:boolean; override;
    function SyncEvent(Event:TRtcEvent):boolean; override;
    function inThread:boolean; override;

    function GetThread:TRtcThread; override;

    function Pause:boolean; override;
    function Resume:boolean; override;

    function PostJob(Job:TObject; HighPriority:boolean):boolean; override;

    procedure Processing; override;

  (*** Methods that have to be implemented by the connection provider: *** ->

  protected
    procedure Enter; override;
    procedure Leave; override;

  public
    procedure Connect(Force:boolean=False); override;
    procedure Disconnect; override;
    procedure InternalDisconnect; override;

    procedure Write(const s:string); override;
    function Read:string; override;

    <- *** end ***)
    end;

  TRtcThrServerProvider = class(TRtcBasicServerProvider)
  protected
    function GetServerThread:TRtcThread; virtual; abstract;
    function GetClientThread:TRtcThread; virtual; abstract;

  public
    function SyncEvent(Event:TRtcEvent):boolean; override;

    function inMainThread:boolean; override;
    function inThread:boolean; override;

    function GetThread:TRtcThread; override;

    function Pause:boolean; override;
    function Resume:boolean; override;

    procedure Processing; override;

    function PostJob(Job:TObject; HighPriority:boolean):boolean; override;

  (*** Methods that have to be implemented by the connection provider: ***

  protected
    procedure Enter; override;
    procedure Leave; override;

    procedure CopyFrom(Dup:TRtcConnectionProvider);

    function GetClientThread:TRtcThread; override;
    function GetServerThread:TRtcThread; override;

  public
    procedure Listen; override;
    procedure Disconnect; override;
    procedure InternalDisconnect; override;

    function GetParent:TRtcConnectionProvider; override;

    procedure Write(const s:string); override;
    function Read:string; override;

  *** end ***)
    end;

  TRtcNoThrServerProvider = class(TRtcBasicServerProvider)
  public
    function SyncEvent(Event:TRtcEvent):boolean; override;

    function inMainThread:boolean; override;
    function inThread:boolean; override;

    function GetThread:TRtcThread; override;

    function Pause:boolean; override;
    function Resume:boolean; override;

    procedure Processing; override;

    function PostJob(Job:TObject; HighPriority:boolean):boolean; override;

  (*** Methods that have to be implemented by the connection provider: ***

  protected
    procedure Enter; override;
    procedure Leave; override;

    procedure CopyFrom(Dup:TRtcConnectionProvider);

  public
    procedure Listen; override;
    procedure Disconnect; override;
    procedure InternalDisconnect; override;

    function GetParent:TRtcConnectionProvider; override;

    procedure Write(const s:string); override;
    function Read:string; override;

  *** end ***)
    end;

implementation

{ TRtcThrClientProvider }

function TRtcThrClientProvider.inMainThread: boolean;
  begin
{$IFDEF CLR}
  Result := System.Threading.Thread.CurrentThread = MainThr;
{$ELSE}
  Result := GetCurrentThreadId=MainThrID;
{$ENDIF}
  end;

function TRtcThrClientProvider.inThread: boolean;
  begin
  if GetClientThread<>nil then
    Result:=GetClientThread.ThreadID=GetCurrentThreadId
  else if GetMultiThreaded then
    Result:=inMainThread
  else
    Result:=True;
  end;

function TRtcThrClientProvider.Pause: boolean;
  begin
  if GetClientThread<>nil then
    begin
    GetClientThread.Pause;
    Result:=True;
    end
  else
    Result:=False;
  end;

function TRtcThrClientProvider.Resume: boolean;
  begin
  if GetClientThread<>nil then
    begin
    GetClientThread.Resume;
    Result:=True;
    end
  else
    Result:=False;
  end;

function TRtcThrClientProvider.PostJob(Job: TObject; HighPriority: boolean): boolean;
  begin
  if GetClientThread<>nil then
    begin
    Result:=TRtcThread.PostJob(GetClientThread,Job,HighPriority);
    end
  else if (Job is TRtcJob) and not GetMultiThreaded {and inMainThread} then
    begin
    TRtcJob(Job).Run(nil);
    Result:=True;
    end
  else
    Result:=False;
  end;

procedure TRtcThrClientProvider.Processing;
  begin
  if RTC_LIMIT_CONN and (GetClientThread<>nil) then
    rtcCloseAction(GetClientThread);
  end;

function TRtcThrClientProvider.SyncEvent(Event: TRtcEvent): boolean;
  begin
  if assigned(Event) then
    begin
    if not GetMultiThreaded then
      begin
      Event;
      Result:=True;
      end
    else if inMainThread then
      begin
      Event;
      Result:=True;
      end
    else if GetClientThread<>nil then
      begin
      GetClientThread.Sync(Event);
      Result:=True;
      end
    else
      Result:=False;
    end
  else
    Result:=False;
  end;

procedure TRtcThrClientProvider.Release;
  begin
  Free;
  end;

function TRtcThrClientProvider.GetThread: TRtcThread;
  begin
  Result:=GetClientThread;
  end;

{ TRtcNoThrClientProvider }

function TRtcNoThrClientProvider.inMainThread: boolean;
  begin
{$IFDEF CLR}
  Result := System.Threading.Thread.CurrentThread = MainThr;
{$ELSE}
  Result := GetCurrentThreadId=MainThrID;
{$ENDIF}
  end;

function TRtcNoThrClientProvider.inThread: boolean;
  begin
  Result:=True; // inMainThread;
  end;

function TRtcNoThrClientProvider.Pause: boolean;
  begin
  Result:=False;
  end;

function TRtcNoThrClientProvider.Resume: boolean;
  begin
  Result:=False;
  end;

function TRtcNoThrClientProvider.PostJob(Job: TObject; HighPriority: boolean): boolean;
  begin
  if (Job is TRtcJob) then
    begin
    TRtcJob(Job).Run(nil);
    Result:=True;
    end
  else
    Result:=False;
  end;

procedure TRtcNoThrClientProvider.Processing;
  begin
  // nothing to do
  end;

function TRtcNoThrClientProvider.SyncEvent(Event: TRtcEvent): boolean;
  begin
  if assigned(Event) then
    begin
    if not GetMultiThreaded then
      begin
      Event;
      Result:=True;
      end
    else if inMainThread then
      begin
      Event;
      Result:=True;
      end
    else
      Result:=False;
    end
  else
    Result:=False;
  end;

function TRtcNoThrClientProvider.GetThread: TRtcThread;
  begin
  Result:=nil;
  end;

{ TRtcThrServerProvider }

function TRtcThrServerProvider.inMainThread: boolean;
  begin
{$IFDEF CLR}
  Result := System.Threading.Thread.CurrentThread = MainThr;
{$ELSE}
  Result := GetCurrentThreadId=MainThrID;
{$ENDIF}
  end;

function TRtcThrServerProvider.inThread: boolean;
  begin
  if GetClientThread<>nil then
    Result:=GetClientThread.ThreadID=GetCurrentThreadId
  else if GetServerThread<>nil then
    Result:=GetServerThread.ThreadID=GetCurrentThreadId
  else if GetMultiThreaded then
    Result:=inMainThread
  else
    Result:=True;
  end;

function TRtcThrServerProvider.Pause: boolean;
  begin
  if GetClientThread<>nil then
    begin
    GetClientThread.Pause;
    Result:=True;
    end
  else if GetServerThread<>nil then
    begin
    GetServerThread.Pause;
    Result:=True;
    end
  else
    Result:=False;
  end;

function TRtcThrServerProvider.Resume: boolean;
  begin
  if GetClientThread<>nil then
    begin
    GetClientThread.Resume;
    Result:=True;
    end
  else if GetServerThread<>nil then
    begin
    GetServerThread.Resume;
    Result:=True;
    end
  else
    Result:=False;
  end;

function TRtcThrServerProvider.PostJob(Job: TObject; HighPriority: boolean): boolean;
  begin
  if GetClientThread<>nil then
    begin
    Result:=TRtcThread.PostJob(GetClientThread,Job,HighPriority);
    end
  else if GetServerThread<>nil then
    begin
    Result:=TRtcThread.PostJob(GetServerThread,Job,HighPriority);
    end
  else if (Job is TRtcJob) and not GetMultiThreaded {and inMainThread} then
    begin
    TRtcJob(Job).Run(nil);
    Result:=True;
    end
  else
    Result:=False;
  end;

procedure TRtcThrServerProvider.Processing;
  begin
  if RTC_LIMIT_CONN and (GetClientThread<>nil) then
    rtcCloseAction(GetClientThread);
  end;

function TRtcThrServerProvider.SyncEvent(Event: TRtcEvent): boolean;
  begin
  if assigned(Event) then
    begin
    if not GetMultiThreaded then
      begin
      Event;
      Result:=True;
      end
    else if inMainThread then
      begin
      Event;
      Result:=True;
      end
    else if GetClientThread<>nil then
      begin
      GetClientThread.Sync(Event);
      Result:=True;
      end
    else if GetServerThread<>nil then
      begin
      GetServerThread.Sync(Event);
      Result:=True;
      end
    else
      Result:=False;
    end
  else
    Result:=False;
  end;

function TRtcThrServerProvider.GetThread: TRtcThread;
  begin
  Result:=GetClientThread;
  if not assigned(Result) then
    Result:=GetServerThread;
  end;

{ TRtcNoThrServerProvider }

function TRtcNoThrServerProvider.inMainThread: boolean;
  begin
{$IFDEF CLR}
  Result := System.Threading.Thread.CurrentThread = MainThr;
{$ELSE}
  Result := GetCurrentThreadId=MainThrID;
{$ENDIF}
  end;

function TRtcNoThrServerProvider.inThread: boolean;
  begin
  Result:=True; // inMainThread;
  end;

function TRtcNoThrServerProvider.Pause: boolean;
  begin
  Result:=False;
  end;

function TRtcNoThrServerProvider.Resume: boolean;
  begin
  Result:=False;
  end;

function TRtcNoThrServerProvider.PostJob(Job: TObject; HighPriority: boolean): boolean;
  begin
  if (Job is TRtcJob) then
    begin
    TRtcJob(Job).Run(nil);
    Result:=True;
    end
  else
    Result:=False;
  end;

procedure TRtcNoThrServerProvider.Processing;
  begin
  // nothing to do
  end;

function TRtcNoThrServerProvider.SyncEvent(Event: TRtcEvent): boolean;
  begin
  if assigned(Event) then
    begin
    if not GetMultiThreaded then
      begin
      Event;
      Result:=True
      end
    else if inMainThread then
      begin
      Event;
      Result:=True;
      end
    else
      Result:=False;
    end
  else
    Result:=False;
  end;

function TRtcNoThrServerProvider.GetThread: TRtcThread;
  begin
  Result:=nil;
  end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -