diff --git a/uutlGenerics.pas b/uutlGenerics.pas index fa42bed..70f0355 100644 --- a/uutlGenerics.pas +++ b/uutlGenerics.pas @@ -331,20 +331,21 @@ type { Lock-Free Queue for single Producer / Consumer calls; Producer and Consumer are synchronized with SpinLocks } generic TutlQueue = class(TObject) - private type + public type PListItem = ^TListItem; TListItem = packed record data: T; next: PListItem; end; private + function GetCount: Integer; + protected fFirst: PListItem; fLast: PListItem; fFirstLock: Cardinal; fLastLock: Cardinal; fCount: Integer; fOwnsObjects: Boolean; - function GetCount: Integer; public property Count: Integer read GetCount; diff --git a/uutlMessageThread.pas b/uutlMessageThread.pas index b67344a..7fa6f93 100644 --- a/uutlMessageThread.pas +++ b/uutlMessageThread.pas @@ -15,7 +15,7 @@ uses type //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TutlMessageThread = class(TThread, IUnknown) - private type + public type TMessageQueue = class(specialize TutlQueue) private fEvent: TSimpleEvent; @@ -27,15 +27,15 @@ type constructor Create(const aOwnsObjects: Boolean = true); destructor Destroy; override; end; - private - fMessages: TMessageQueue; protected + fMessages: TMessageQueue; fRefCount : longint; { implement methods of IUnknown } function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual; function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual; protected + function CreateMessageQueue: TMessageQueue; virtual; function WaitForMessages(const aWaitTime: Cardinal): Boolean; function ProcessMessages: Boolean; virtual; procedure ProcessMessage(const {%H-}aMessage: TutlMessage); virtual; @@ -249,6 +249,12 @@ begin result := InterLockedDecrement(fRefCount); end; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +function TutlMessageThread.CreateMessageQueue: TMessageQueue; +begin + result := TMessageQueue.Create(true); +end; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TutlMessageThread.WaitForMessages(const aWaitTime: Cardinal): Boolean; begin @@ -343,7 +349,7 @@ end; constructor TutlMessageThread.Create(CreateSuspended: Boolean; const StackSize: SizeUInt); begin inherited Create(CreateSuspended, StackSize); - fMessages := TMessageQueue.Create; + fMessages := CreateMessageQueue; Threads.Lock; try Threads.Add(ThreadID, self); diff --git a/uutlMessages.pas b/uutlMessages.pas index 613e500..b46b261 100644 --- a/uutlMessages.pas +++ b/uutlMessages.pas @@ -24,7 +24,7 @@ const type //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TutlMessage = class(TObject) - private + protected fID: Cardinal; fWParam: PtrInt; fLParam: PtrInt;