Ignore:
Timestamp:
Dec 18, 2009, 12:21:39 PM (15 years ago)
Author:
george
Message:
  • Upraveno: Nedokončené přepracování správy vláken. Použit systém přidělování ze společné sady o dané velikosti namísto přidělování vláken ke každému požadavku samostatně. Vlákna jsou inicializována při spuštění aplikace, jsou opakovaně používána a uvolněna až při ukončení běhu aplikace.
  • Přidáno: Třída pro práci s opakovaně spustitelnými vlákny.
  • Přidáno: Třída přidělování objektů ze zásoby o dané velikosti.
  • Přidáno: Třída pro zobrazování stránkování seznamů položek.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DirectWeb/UTCPServer.pas

    r84 r88  
    1313  //LibC,
    1414  {$ENDIF}
    15   BlckSock;
     15  BlckSock, UPool, UResetableThread;
    1616
    1717type
    1818  TTCPServer = class;
    19   TTCPClientList = class;
    2019
    2120  { TTCPClientThread }
    2221
    23   TTCPClientThread = class(TThread)
    24     Parent: TTCPClientList;
     22  TTCPClientThread = class(TResetableThread)
     23    Parent: TTCPServer;
    2524    Socket: TTCPBlockSocket;
    2625    procedure Execute; override;
    27     constructor Create(CreateSuspended: Boolean;
    28       const StackSize: SizeUInt = DefaultStackSize);
     26    constructor Create;
    2927    destructor Destroy; override;
     28  end;
     29
     30  { TClientThreadedPool }
     31
     32  TClientThreadedPool = class(TThreadedPool)
     33  private
     34    FActive: Boolean;
     35    procedure SetActive(const AValue: Boolean);
     36  public
     37    property Active: Boolean read FActive write SetActive;
    3038  end;
    3139
     
    3543    Parent: TTCPServer;
    3644    procedure Execute; override;
    37   end;
    38 
    39   { TTCPClientList }
    40 
    41   TTCPClientList = class(TList)
    42     Parent: TTCPServer;
    43     procedure Add(ASocket: TSocket);
    44     procedure Remove(Item: TTCPClientThread);
    45     procedure Terminate;
    46     procedure WaitFor;
    47     constructor Create;
    48     destructor Destroy; override;
    4945  end;
    5046
     
    5955    procedure SetActive(const AValue: Boolean);
    6056  public
    61     Clients: TTCPClientList;
     57    ThreadPool: TClientThreadedPool;
    6258    Address: string;
    6359    Port: Word;
     
    7773  if AValue and not FActive then begin
    7874    with Socket do begin
     75      ThreadPool.Active := True;
    7976      CreateSocket;
    8077      SetLinger(True, 10);
     
    9693      AcceptThread.WaitFor;
    9794      AcceptThread.Destroy;
    98       Clients.Terminate;
    99       Clients.WaitFor;
     95      ThreadPool.Active := False;
    10096      CloseSocket;
    10197    end;
     
    105101
    106102constructor TTCPServer.Create;
     103var
     104  I: Integer;
    107105begin
    108   Clients := TTCPClientList.Create;
    109   Clients.Parent := Self;
     106  ThreadPool := TClientThreadedPool.Create;
     107  ThreadPool.TotalCount := 10;
     108
    110109  Socket := TTCPBlockSocket.Create;
    111110  Address := '0.0.0.0';
     
    115114destructor TTCPServer.Destroy;
    116115begin
     116  ThreadPool.Destroy;
    117117  Active := False;
    118118  Socket.Destroy;
    119   Clients.Destroy;
    120119  inherited Destroy;
    121120end;
     
    126125var
    127126  NewSocket: TSocket;
     127  NewObject: TTCPClientThread;
    128128begin
    129129  repeat
     
    131131      NewSocket := Parent.Socket.Accept;
    132132      if Parent.Socket.LastError = 0 then begin
    133         Parent.Clients.Add(NewSocket);
     133        NewObject := TTCPClientThread(Parent.ThreadPool.Acquire);
     134        NewObject.Parent := Parent;
     135        NewObject.Socket.Socket := NewSocket;
     136        NewObject.Start;
    134137      end;
    135138    end;
    136139  until Terminated;
    137 end;
    138 
    139 { TTCPClientList }
    140 
    141 procedure TTCPClientList.Add(ASocket: TSocket);
    142 begin
    143   with TTCPClientThread(Items[inherited Add(TTCPClientThread.Create(True))]) do begin
    144     Socket.Socket := ASocket;
    145     Parent := Self;
    146     Resume;
    147   end;
    148 end;
    149 
    150 procedure TTCPClientList.Remove(Item: TTCPClientThread);
    151 begin
    152   inherited Remove(Item);
    153   Item.Destroy;
    154 end;
    155 
    156 procedure TTCPClientList.Terminate;
    157 var
    158   I: Integer;
    159 begin
    160   for I := 0 to Count - 1 do
    161     TTCPClientThread(Items[I]).Terminate;
    162 end;
    163 
    164 procedure TTCPClientList.WaitFor;
    165 var
    166   I: Integer;
    167 begin
    168   for I := 0 to Count - 1 do
    169     TTCPClientThread(Items[I]).WaitFor;
    170 end;
    171 
    172 constructor TTCPClientList.Create;
    173 begin
    174   inherited;
    175 end;
    176 
    177 destructor TTCPClientList.Destroy;
    178 var
    179   I: Integer;
    180 begin
    181   for I := 0 to Count - 1 do
    182     TTCPClientThread(Items[I]).Destroy;
    183   inherited Destroy;
    184140end;
    185141
     
    188144procedure TTCPClientThread.Execute;
    189145begin
    190   if Assigned(Parent.Parent.FOnClientConnect) then
    191     Parent.Parent.FOnClientConnect(Self);
    192   Parent.Remove(Self);
     146  if Assigned(Parent.FOnClientConnect) then
     147    Parent.FOnClientConnect(Self);
    193148end;
    194149
    195 constructor TTCPClientThread.Create(CreateSuspended: Boolean;
    196   const StackSize: SizeUInt);
     150constructor TTCPClientThread.Create;
    197151begin
    198   inherited Create(CreateSuspended, StackSize);
     152  inherited;
    199153  Socket := TTCPBlockSocket.Create;
    200154end;
     
    202156destructor TTCPClientThread.Destroy;
    203157begin
    204   //Socket.Destroy;
    205   inherited Destroy;
     158  Socket.Destroy;
     159  inherited;
     160end;
     161
     162{ TClientThreadedPool }
     163
     164procedure TClientThreadedPool.SetActive(const AValue: Boolean);
     165var
     166  I: Integer;
     167begin
     168  if not FActive and Active then begin
     169    Allocate;
     170    for I := 0 to TotalCount - 1 do begin
     171      TThreadedPoolItem(Items[I]).Item := TTCPClientThread.Create;
     172    end;
     173  end else
     174  if FActive and not Active then begin
     175
     176  end;
     177  FActive := Active;
    206178end;
    207179
Note: See TracChangeset for help on using the changeset viewer.