Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

202 righe
8.1 KiB

  1. unit uutlMessages;
  2. { Package: Utils
  3. Prefix: utl - UTiLs
  4. Beschreibung: diese Unit enthält verschiedene Klassen, die Messages definieren,
  5. die zwischen utlMessageThreads ausgetauscht werden können }
  6. {$mode objfpc}{$H+}
  7. interface
  8. uses
  9. Classes, SysUtils, syncobjs;
  10. const
  11. //General
  12. MSG_CALLBACK = $00010001; //TutlCallbackMsg
  13. MSG_SYNC_CALLBACK = $00010002; //TutlSyncCallbackMsg
  14. //User
  15. MSG_USER = $F0000000;
  16. type
  17. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  18. TutlMessage = class(TObject)
  19. protected
  20. fID: Cardinal;
  21. fWParam: PtrInt;
  22. fLParam: PtrInt;
  23. fArgs: TObject;
  24. fOwnsObjects: Boolean;
  25. public
  26. property ID: Cardinal read fID;
  27. property WParam: PtrInt read fWParam;
  28. property LParam: PtrInt read fLParam;
  29. property Args: TObject read fArgs;
  30. property OwnsObjects: Boolean read fOwnsObjects write fOwnsObjects;
  31. constructor Create(const aID: Cardinal; const aWParam, aLParam: PtrInt); overload;
  32. constructor Create(const aID: Cardinal; const aArgs: TObject; const aOwnsObjects: Boolean = true); overload;
  33. destructor Destroy; override;
  34. end;
  35. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  36. TutlSynchronousMessage = class(TutlMessage)
  37. private
  38. fEvent: TEvent;
  39. fFreeOnFinish: Boolean;
  40. fLock: Integer;
  41. procedure Lock;
  42. procedure Unlock;
  43. public
  44. procedure Finish;
  45. function WaitFor(const aTimeout: Cardinal): TWaitResult;
  46. constructor Create(const aID: Cardinal; const aWParam, aLParam: PtrInt); overload;
  47. constructor Create(const {%H-}aID: Cardinal; const aArgs: TObject; const aOwnsObjects: Boolean = true); overload;
  48. destructor Destroy; override;
  49. end;
  50. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  51. TutlCallbackMsg = class(TutlMessage)
  52. public
  53. procedure ExecuteCallback; virtual;
  54. constructor Create; overload;
  55. end;
  56. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. TutlSyncCallbackMsg = class(TutlSynchronousMessage)
  58. public
  59. procedure ExecuteCallback; virtual;
  60. constructor Create; overload;
  61. end;
  62. implementation
  63. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. //TutlMessage///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  66. constructor TutlMessage.Create(const aID: Cardinal; const aWParam, aLParam: PtrInt);
  67. begin
  68. inherited Create;
  69. fID := aID;
  70. fWParam := aWParam;
  71. fLParam := aLParam;
  72. fArgs := nil;
  73. fOwnsObjects := true;
  74. end;
  75. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  76. constructor TutlMessage.Create(const aID: Cardinal; const aArgs: TObject; const aOwnsObjects: Boolean);
  77. begin
  78. inherited Create;
  79. fID := aID;
  80. fWParam := 0;
  81. fLParam := 0;
  82. fArgs := aArgs;
  83. fOwnsObjects := aOwnsObjects;
  84. end;
  85. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. destructor TutlMessage.Destroy;
  87. begin
  88. if Assigned(fArgs) and fOwnsObjects then
  89. FreeAndNil(fArgs);
  90. inherited Destroy;
  91. end;
  92. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. //TutlSynchronousMessage//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  95. procedure TutlSynchronousMessage.Lock;
  96. begin
  97. repeat until (InterLockedExchange(fLock, 1) = 0);
  98. end;
  99. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  100. procedure TutlSynchronousMessage.Unlock;
  101. begin
  102. InterLockedExchange(fLock, 0);
  103. end;
  104. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  105. procedure TutlSynchronousMessage.Finish;
  106. begin
  107. fEvent.SetEvent;
  108. Lock;
  109. if fFreeOnFinish then
  110. Free
  111. else
  112. Unlock;
  113. end;
  114. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  115. function TutlSynchronousMessage.WaitFor(const aTimeout: Cardinal): TWaitResult;
  116. begin
  117. Lock;
  118. try
  119. result := fEvent.WaitFor(aTimeout);
  120. fFreeOnFinish := (result <> wrSignaled);
  121. finally
  122. Unlock;
  123. end;
  124. end;
  125. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  126. constructor TutlSynchronousMessage.Create(const aID: Cardinal; const aWParam, aLParam: PtrInt);
  127. begin
  128. inherited Create(aID, aWParam, aLParam);
  129. fEvent := TEvent.Create(nil, true, false, '');
  130. fFreeOnFinish := false;
  131. fLock := 0;
  132. end;
  133. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  134. constructor TutlSynchronousMessage.Create(const aID: Cardinal; const aArgs: TObject; const aOwnsObjects: Boolean);
  135. begin
  136. inherited Create(ID, aArgs, aOwnsObjects);
  137. fEvent := TEvent.Create(nil, true, false, '');
  138. fFreeOnFinish := false;
  139. fLock := 0;
  140. end;
  141. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  142. destructor TutlSynchronousMessage.Destroy;
  143. begin
  144. fEvent.SetEvent;
  145. FreeAndNil(fEvent);
  146. inherited Destroy;
  147. end;
  148. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  149. //TutlCallbackMsg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  150. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  151. procedure TutlCallbackMsg.ExecuteCallback;
  152. begin
  153. //DUMMY
  154. end;
  155. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  156. constructor TutlCallbackMsg.Create;
  157. begin
  158. inherited Create(MSG_CALLBACK, 0, 0);
  159. end;
  160. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  161. //TutlSyncCallbackMsg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  162. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  163. procedure TutlSyncCallbackMsg.ExecuteCallback;
  164. begin
  165. //DUMMY
  166. end;
  167. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  168. constructor TutlSyncCallbackMsg.Create;
  169. begin
  170. inherited Create(MSG_SYNC_CALLBACK, 0, 0);
  171. end;
  172. end.