IdFiberWeaverThreaded.pas 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. public
  52. constructor Create(AOwner: TComponent); override;
  53. destructor Destroy; override;
  54. procedure Add(AFiber: TIdFiber); override;
  55. published
  56. property ThreadScheduler: TIdSchedulerOfThread read FThreadScheduler
  57. write FThreadScheduler;
  58. end;
  59. implementation
  60. uses
  61. SysUtils;
  62. { TTempThread }
  63. procedure TTempThread.AfterRun;
  64. begin
  65. inherited;
  66. FreeAndNil(FFiberWeaver);
  67. end;
  68. procedure TTempThread.BeforeRun;
  69. begin
  70. inherited;
  71. //TODO: Make this pluggable at run time? depends where threads come
  72. //from - merge to scheduler? Base is in IdFiber though....
  73. FFiberWeaver := TIdFiberWeaverInline.Create(nil);
  74. FFiberWeaver.FreeFibersOnCompletion := True;
  75. end;
  76. procedure TTempThread.Run;
  77. begin
  78. //TODO: Temp hack
  79. if FFiberWeaver.HasFibers then begin
  80. FFiberWeaver.ProcessInThisThread;
  81. end else begin
  82. //Sleep(50);
  83. FFiberWeaver.WaitForFibers(50);
  84. end;
  85. end;
  86. { TIdFiberWeaverThreaded }
  87. constructor TIdFiberWeaverThreaded.Create(AOwner: TComponent);
  88. begin
  89. inherited Create(AOwner);
  90. if not IsDesignTime then begin
  91. FTempThread := TTempThread.Create(False, True, 'TIdSchedulerOfFiber Temp'); {do not localize}
  92. end;
  93. end;
  94. destructor TIdFiberWeaverThreaded.Destroy;
  95. begin
  96. // is only created at run time
  97. if FTempThread <> nil then begin
  98. FTempThread.TerminateAndWaitFor;
  99. FTempThread.Free;
  100. end;
  101. inherited;
  102. end;
  103. procedure TIdFiberWeaverThreaded.Add(AFiber: TIdFiber);
  104. begin
  105. FTempThread.FFiberWeaver.Add(AFiber);
  106. end;
  107. end.