Meine Idee dazu wäre ja, für jeden Thread eine eigene Liste anzulegen ähnlich dem Konstrukt was ich mal von Sebastian erhalten habe:
Delphi-Quellcode:
TDataQueue = class
private
FQueue: TQueue<TDataRec>;
FLock: TCriticalSection;
public
constructor Create;
destructor Destroy; override;
procedure Enqueue(const Data: TDataRec);
function Dequeue: TDataRec;
end;
constructor TDataQueue.Create;
begin
FQueue := TQueue<TDataRec>.Create;
FLock := TCriticalSection.Create;
end;
destructor TDataQueue.Destroy;
begin
FQueue.Free;
FLock.Free;
inherited;
end;
procedure TDataQueue.Enqueue(const Data: TDataRec);
begin
FLock.Acquire;
try
FQueue.Enqueue(Data);
finally
FLock.Release;
end;
end;
function TDataQueue.Dequeue: TDataRec;
begin
FLock.Acquire;
try
if FQueue.Count > 0 then
Result := FQueue.Dequeue
else
begin
Result.Clear;
end;
finally
FLock.Release;
end;
end;
TMyThread = class(TThread)
private
FDataQueue: TDataQueue;
protected
procedure Execute; override;
public
constructor Create(ADataQueue: TDataQueue);
end;
constructor TMyThread.Create(ADataQueue: TDataQueue);
begin
FDataQueue := ADataQueue;
Inherited Create(False);
end;
procedure TMyThread.Execute;
var
RecData : TDataRec;
begin
while not Terminated do
begin
if Terminated then
Exit;
if Assigned(FDataQueue) then
begin
if FDataQueue.Count > 0 then
begin
RecData := FDataQueue.Dequeue;
//Hier etwas mit den Daten/der Nachricht machen
end
else
begin
Sleep(1);
end;
end;
end;
end;
Das müsste soweit mit der Abarbeitung einer Liste mit Nachrichten ja gehen oder habe ich was übersehen?
Irgendein anderer Thread trägt dann in die Liste die Daten so ein:
FDataQueue.Enqueue(Daten);
Wie würde man aber das Konstrukt oben noch umbauen, damit es auch mit Events arbeitet.
So pollt der Thread ja die ganze Zeit die Liste ab, deswegen auch das Sleep, damit die CPU Auslastung runter geht.
Jetzt möchte ich dem Thread aber auch noch bestimmte Events schicken z.B. aus meiner Ursprungsvariante das PostThreadMessage zum terminieren des Threads