Aber grade das will ich ja nicht:
Irgendein Thread.
Ich habe einen TThread, der hat irgendwann Daten berechnet/gesammelt. Mit denen soll in einem anderen Thread gearbeitet werden. Ich habe auf die Schnelle mal das hier hingeklatscht:
Delphi-Quellcode:
TWorkThread = class abstract(TThread)
private var
workQueue: TThreadedQueue<TProc>;
protected
procedure Execute(); override;
public
constructor Create();
destructor Destroy(); override;
procedure pushWork(const proc: TProc); virtual;
end;
{ TWorkThread }
constructor TWorkThread.Create();
begin
inherited Create(True);
workQueue := TThreadedQueue<TProc>.Create();
end;
destructor TWorkThread.Destroy();
begin
workQueue.Free();
inherited;
end;
procedure TWorkThread.Execute();
const
sleepIntervalMs = 500;
var
waitResult: TWaitResult;
workItem: TProc;
begin
Write('worker Thread ID is ');
Write(TThread.CurrentThread.ThreadID);
Write(sLineBreak);
counter := 0;
while not Terminated do begin
waitResult := workQueue.PopItem(workItem);
if (waitResult = TWaitResult.wrSignaled) then workItem();
// Und jetzt den Kram, den der Thread eigentlich vorhatte...
sleep(sleepIntervalMs);
end;
end;
procedure TWorkThread.pushWork(const proc: TProc);
begin
if not Assigned(proc) then Exit;
workQueue.PushItem(proc);
end;
So einfach kann es doch sein, oder?