Main.pas 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. { $HDR$}
  2. {**********************************************************************}
  3. { Unit archived using Team Coherence }
  4. { Team Coherence is Copyright 2002 by Quality Software Components }
  5. { }
  6. { For further information / comments, visit our WEB site at }
  7. { http://www.TeamCoherence.com }
  8. {**********************************************************************}
  9. {}
  10. { $Log: 17073: Main.pas }
  11. {
  12. { Rev 1.3 2003.03.26 12:32:14 AM czhower
  13. { TCP server and comps created on form now.
  14. }
  15. {
  16. { Rev 1.2 2003.03.26 12:26:46 AM czhower
  17. }
  18. {
  19. Rev 1.1 3/14/2003 2:38:02 PM BGooijen
  20. Synchronised logging
  21. }
  22. {
  23. Rev 1.0 3/13/2003 5:03:32 PM BGooijen
  24. Initial check in
  25. }
  26. {
  27. { Rev 1.6 2003.02.25 1:38:28 AM czhower
  28. }
  29. {
  30. { Rev 1.5 2003.02.18 1:36:18 PM czhower
  31. }
  32. {
  33. { Rev 1.4 2003.01.17 4:41:30 PM czhower
  34. }
  35. {
  36. { Rev 1.3 2003.01.09 11:25:30 PM czhower
  37. }
  38. {
  39. { Rev 1.0 2002.12.07 6:44:02 PM czhower
  40. }
  41. unit Main;
  42. {TODO
  43. -Create about 10 fibers. Does not handle errors well.
  44. -Schedule accross multiple threads
  45. -ChainEngines. Make a component?
  46. -Improve the speed of TIdChainQueue, TList is not very efficient
  47. -Make chain engine a component, and componentize items to be used at design time
  48. -ChainEngine
  49. // TODO: Have an option that allows writes to occur before reads (or vice versa) if they are farther
  50. // down the queue.
  51. // Would be an option as it could goof up some implementations, but most would deal with it fine and
  52. // would have significant performance boosts in ADSL environments.
  53. -Need to handle exceptions. May have trouble in pre D7, see below.
  54. -May be easier to simply swap the threadvar pointer. This would create
  55. "Fibervar" support.
  56. -Another option is to never allow switchto while an active exception is in process.
  57. -The functions mentioned below are deprecated
  58. -Find TLS discussion and limits from notes
  59. "Tjipke A. van der Plaats" <[email protected]>
  60. any knowledge of fibers in your team? If, for example, you would like to be
  61. able to support exceptions for each fiber, you need to preserve the
  62. exception stack (RaiseList): and there is a bug in that part of Delphi that
  63. was only just fixed in D7 (SetRaiseList doesn't work in pre D7 versions).
  64. }
  65. interface
  66. uses
  67. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  68. Dialogs, StdCtrls,
  69. IdFiber, IdTCPClient, IdSync, IdFiberWeaver, ExtCtrls, IdIOHandlerChain,IdContext,IdHTTPHeaderInfo,IdCustomHTTPServer,
  70. ComCtrls, IdBaseComponent, IdComponent, IdTCPServer,IdCmdTCPServer,IdHTTPServer,
  71. IdServerIOHandler, IdServerIOHandlerChain, IdChainEngineStack,
  72. IdScheduler, IdSchedulerFiber;
  73. type
  74. TformMain = class(TForm)
  75. Button1: TButton;
  76. Button2: TButton;
  77. memoTest: TMemo;
  78. tcpsTest: TIdCmdTCPServer;
  79. IdServerIOHandlerChain1: TIdServerIOHandlerChain;
  80. IdChainEngineStack1: TIdChainEngineStack;
  81. IdSchedulerFiber1: TIdSchedulerFiber;
  82. procedure Button1Click(Sender: TObject);
  83. procedure Button2Click(Sender: TObject);
  84. procedure FormDestroy(Sender: TObject);
  85. private
  86. protected
  87. procedure IdHTTPServer1Get(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
  88. procedure IdHTTPServer1Connect(AContext:TIdContext);
  89. procedure IdHTTPServer1DisConnect(AContext:TIdContext);
  90. public
  91. IdHTTPServer1:TIdHTTPServer;
  92. end;
  93. var
  94. formMain: TformMain;
  95. implementation
  96. {$R *.dfm}
  97. uses
  98. Global,
  99. SyncObjs;
  100. type
  101. TConnectSync = class(TIdSync)
  102. protected
  103. procedure DoSynchronize; override;
  104. public
  105. class procedure CreateSync;
  106. end;
  107. TDisconnectSync = class(TConnectSync)
  108. protected
  109. procedure DoSynchronize; override;
  110. end;
  111. procedure TformMain.Button1Click(Sender: TObject);
  112. begin
  113. tcpsTest.Active := True;
  114. end;
  115. procedure TformMain.Button2Click(Sender: TObject);
  116. begin
  117. //TIdServerIOHandlerChain(IdHTTPServer1.IOHandler).ChainEngine:=TIdChainEngineStack.create(IdHTTPServer1.IOHandler);
  118. IdHTTPServer1:=TIdHTTPServer.create(self);
  119. IdHTTPServer1.KeepAlive:=false;
  120. IdHTTPServer1.OnCommandGet:=IdHTTPServer1Get;
  121. IdHTTPServer1.OnConnect:=IdHTTPServer1Connect;
  122. IdHTTPServer1.OnDisconnect:=IdHTTPServer1DisConnect;
  123. IdHTTPServer1.IOHandler:=TIdServerIOHandlerChain.Create(IdHTTPServer1);
  124. IdHTTPServer1.Scheduler:=TIdSchedulerFiber.Create(IdHTTPServer1);
  125. IdHTTPServer1.Active := true;
  126. end;
  127. procedure TformMain.IdHTTPServer1Get(AContext:TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
  128. var
  129. LDoc:string;
  130. begin
  131. LDoc:=ARequestInfo.Document;
  132. if copy(LDoc,length(LDoc),1)='/' then
  133. LDoc:=LDoc+'index.html';
  134. if copy(LDoc,1,1)='/' then delete(LDoc,1,1);
  135. AResponseInfo.ContentStream:=TFileStream.create(ExtractFilePath(paramstr(0))+'web\'+ldoc, fmOpenRead or fmShareDenyWrite);
  136. // AResponseInfo.ContentText:='YES, it works!!!';
  137. end;
  138. procedure TformMain.IdHTTPServer1Connect(AContext:TIdContext);
  139. begin
  140. TConnectSync.CreateSync;
  141. end;
  142. procedure TformMain.IdHTTPServer1DisConnect(AContext:TIdContext);
  143. begin
  144. TDisconnectSync.CreateSync;
  145. end;
  146. procedure TformMain.FormDestroy(Sender: TObject);
  147. begin
  148. FreeAndNil(IdHTTPServer1);
  149. end;
  150. { TConnectSync }
  151. class procedure TConnectSync.CreateSync;
  152. var LCon : TConnectSync;
  153. begin
  154. LCon := Create;
  155. LCon.Synchronize;
  156. end;
  157. procedure TConnectSync.DoSynchronize;
  158. begin
  159. formMain.memoTest.Lines.Add('<<Client connected>>');
  160. end;
  161. { TDisconnectSync }
  162. procedure TDisconnectSync.DoSynchronize;
  163. begin
  164. formMain.memoTest.Lines.Add('<<Client disconnected>>');
  165. end;
  166. end.