www.pudn.com > Indy10_New_Demo.rar > Main.pas
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPServer, IdContext,
IdScheduler, IdSchedulerOfThread, IdSchedulerOfThreadDefault, StdCtrls,
IdSchedulerOfThreadPool, IdThreadSafe, IdServerIOHandler,
IdServerIOHandlerChain, IdSchedulerOfFiber, IdIOHandlerChain,
IdFiberWeaver, IdFiberWeaverThreaded;
type
TformMain = class(TForm)
tcpsTest: TIdTCPServer;
schdThread: TIdSchedulerOfThreadDefault;
butnStart: TButton;
schdThreadPool: TIdSchedulerOfThreadPool;
GroupBox1: TGroupBox;
rbtnFiberSingleThread: TRadioButton;
Label2: TLabel;
rbtnThreadPool: TRadioButton;
rbtnThread: TRadioButton;
Label1: TLabel;
radoFiberSingleThreadChain: TRadioButton;
memoLog: TMemo;
butnStop: TButton;
indySchedulerOfFiberAlone: TIdSchedulerOfFiber;
indySchedulerOfFiber: TIdSchedulerOfFiber;
indyIOHChain: TIdServerIOHandlerChain;
indyChainEngine: TIdChainEngine;
indyFiberWeaverThreaded: TIdFiberWeaverThreaded;
indyThreadPoolForFibers: TIdSchedulerOfThreadPool;
procedure tcpsTestExecute(AContext: TIdContext);
procedure butnStartClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure butnStopClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure tcpsTestConnect(AContext: TIdContext);
private
protected
FConnections: TIdThreadSafeInteger;
FReplies: TIdThreadSafeInteger;
public
end;
var
formMain: TformMain;
implementation
{$R *.dfm}
procedure TformMain.tcpsTestExecute(AContext: TIdContext);
var
s: string;
begin
with AContext.Connection do begin
s := IOHandler.ReadLn;
if AnsiSameText(s, 'QUIT') then begin
Disconnect;
end else begin
FReplies.Increment;
IOHandler.WriteLn('Hello ' + s);
end;
end;
end;
procedure TformMain.butnStartClick(Sender: TObject);
begin
memoLog.Clear;
FConnections.Value := 0;
FReplies.Value := 0;
if rbtnThread.Checked then begin
tcpsTest.Scheduler := schdThread;
end else if rbtnThreadPool.Checked then begin
tcpsTest.Scheduler := schdThreadPool;
end else if rbtnFiberSingleThread.Checked then begin
//No IOHandler, can only swap between calls to OnExecute
tcpsTest.Scheduler := indySchedulerOfFiberAlone;
end else if radoFiberSingleThreadChain.Checked then begin
tcpsTest.IOHandler := indyIOHChain;
tcpsTest.Scheduler := indySchedulerOfFiber;
end;
tcpsTest.Active := True;
butnStart.Enabled := False;
end;
procedure TformMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// Necessary because during destruction of form, it tries to destroy
// schedulers while server is still active
tcpsTest.Active := False;
end;
procedure TformMain.butnStopClick(Sender: TObject);
begin
tcpsTest.Active := False;
with memoLog.Lines do begin
Add('Connections: ' + IntToStr(FConnections.Value));
Add('Replies: ' + IntToStr(FReplies.Value));
end;
butnStop.Enabled := False;
end;
procedure TformMain.FormCreate(Sender: TObject);
begin
FConnections := TIdThreadSafeInteger.Create;
FReplies := TIdThreadSafeInteger.Create;
end;
procedure TformMain.FormDestroy(Sender: TObject);
begin
FreeAndNil(FReplies);
FreeAndNil(FConnections);
end;
procedure TformMain.tcpsTestConnect(AContext: TIdContext);
begin
FConnections.Increment;
end;
end.