Hier mal noch die Alternative mit einer Queue (erscheint mir mit Boardmitteln und ohne großen Aufwand die eleganteste Lösung zu sein):
Delphi-Quellcode:
type
TDataStruct = record
public
Timestamp: Cardinal;
Value: Integer;
end;
var
Queue: TQueue<TDataStruct>;
begin
Queue := TQueue<TDataStruct>.Create;
try
// Producer
TThread.CreateAnonymousThread(
procedure
var
Item: TDataStruct;
Counter: Integer;
begin
Counter := 0;
while True do
begin
// Collect data
Item.Timestamp := GetTickCount;
Item.Value := Counter;
Inc(Counter);
// Enqueue
System.TMonitor.Enter(Queue);
try
Queue.Enqueue(Item);
finally
System.TMonitor.Exit(Queue);
end;
Yield;
end;
end).Start;
// Consumer
TThread.CreateAnonymousThread(
procedure
var
Item: TDataStruct;
begin
while True do
begin
// Dequeue
System.TMonitor.Enter(Queue);
try
if (Queue.Count > 0) then
begin
Item := Queue.Dequeue;
end;
finally
System.TMonitor.Exit(Queue);
end;
// Work with local copy
// ...
WriteLn(Item.Value);
end;
end).Start;
finally
Queue.Free;
end;
end;