IdFiberWeaverThreaded.pas 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. {
  2. $Project$
  3. $Workfile$
  4. $Revision$
  5. $DateUTC$
  6. $Id$
  7. This file is part of the Indy (Internet Direct) project, and is offered
  8. under the dual-licensing agreement described on the Indy website.
  9. (http://www.indyproject.org/)
  10. Copyright:
  11. (c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
  12. }
  13. {
  14. $Log$
  15. }
  16. {
  17. Rev 1.4 6/11/2004 8:39:56 AM DSiders
  18. Added "Do not Localize" comments.
  19. Rev 1.3 2004-04-23 19:46:52 Mattias
  20. TTempThread now uses WaitForFibers instead of sleep
  21. Rev 1.2 2004.04.22 11:45:18 PM czhower
  22. Bug fixes
  23. Rev 1.1 2004.02.09 9:16:40 PM czhower
  24. Updated to compile and match lib changes.
  25. Rev 1.0 2004.02.03 12:38:54 AM czhower
  26. Move
  27. Rev 1.2 2003.10.21 12:19:22 AM czhower
  28. TIdTask support and fiber bug fixes.
  29. Rev 1.1 2003.10.19 4:38:32 PM czhower
  30. Updates
  31. }
  32. unit IdFiberWeaverThreaded;
  33. interface
  34. uses
  35. Classes,
  36. IdFiberWeaverInline,
  37. IdThread, IdSchedulerOfThread, IdFiberWeaver, IdFiber;
  38. type
  39. TTempThread = class(TIdThread)
  40. protected
  41. FFiberWeaver: TIdFiberWeaverInline;
  42. //
  43. procedure AfterRun; override;
  44. procedure BeforeRun; override;
  45. procedure Run; override;
  46. end;
  47. TIdFiberWeaverThreaded = class(TIdFiberWeaver)
  48. protected
  49. FThreadScheduler: TIdSchedulerOfThread;
  50. FTempThread: TTempThread;
  51. //
  52. procedure InitComponent; override;
  53. public
  54. procedure Add(
  55. AFiber: TIdFiber
  56. ); override;
  57. destructor Destroy;
  58. override;
  59. published
  60. property ThreadScheduler: TIdSchedulerOfThread read FThreadScheduler
  61. write FThreadScheduler;
  62. end;
  63. implementation
  64. uses
  65. SysUtils;
  66. { TTempThread }
  67. procedure TTempThread.AfterRun;
  68. begin
  69. inherited;
  70. FreeAndNil(FFiberWeaver);
  71. end;
  72. procedure TTempThread.BeforeRun;
  73. begin
  74. inherited;
  75. //TODO: Make this pluggable at run time? depends where threads come
  76. //from - merge to scheduler? Base is in IdFiber though....
  77. FFiberWeaver := TIdFiberWeaverInline.Create(nil);
  78. FFiberWeaver.FreeFibersOnCompletion := True;
  79. end;
  80. procedure TTempThread.Run;
  81. begin
  82. //TODO: Temp hack
  83. if FFiberWeaver.HasFibers then begin
  84. FFiberWeaver.ProcessInThisThread;
  85. end else begin
  86. //Sleep(50);
  87. FFiberWeaver.WaitForFibers(50);
  88. end;
  89. end;
  90. { TIdFiberWeaverThreaded }
  91. procedure TIdFiberWeaverThreaded.Add(AFiber: TIdFiber);
  92. begin
  93. FTempThread.FFiberWeaver.Add(AFiber);
  94. end;
  95. destructor TIdFiberWeaverThreaded.Destroy;
  96. begin
  97. // is only created at run time
  98. if FTempThread <> nil then begin
  99. FTempThread.TerminateAndWaitFor;
  100. FreeAndNil(FTempThread);
  101. end;
  102. inherited;
  103. end;
  104. procedure TIdFiberWeaverThreaded.InitComponent;
  105. begin
  106. inherited;
  107. if not (csDesigning in ComponentState) then begin
  108. FTempThread := TTempThread.Create(False, True, 'TIdSchedulerOfFiber Temp'); {do not localize}
  109. end;
  110. end;
  111. end.