Ich bin jetzt dazu übergegangen, mir ein Array zu übergeben.
Der Aufruf der anonymen Methode von TThread.Queue wird wahrscheinlich immer den letzten Wert für die lokale TDateTime-Variable genommen haben.
Daher die gleichen Werte in der Message.
Die gleichen Instanz-Pointer der Messages sind eher Zufall und liegen einfach nur auf der gleichen Speicheradresse.
Also war mein Problem wahrscheinlich eher ein Missverständis, wie und wann TThread.Queue die übergebenden Methoden aufruft und wie zu diesen Zeitpunkt die Werte außerhalb der anonymen Methode belegt sind.
Delphi-Quellcode:
procedure TMessageThread.DoInternalExecute;
var
DateTimes : TArray<TDateTime>;
begin
while not Terminated do
begin
try
FLock.Enter;
try
if FStack.Count >= 25 then
begin
if not Terminated then
begin
DateTimes := FStack.ToArray;
Queue(
procedure
begin
DoSendMessage(DateTimes);
end);
FStack.Clear;
end;
end;
finally
FLock.Leave;
end;
finally
Sleep(100);
end;
end;
end;
procedure TMessageThread.DoSendMessage(const DateTimes : TArray<TDateTime>);
var
LMessage : TDateTimeMessage;
LDateTime : TDateTime;
begin
for LDateTime in DateTimes do
begin
LMessage := TDateTimeMessage.Create(LDateTime);
TMessageManager.DefaultManager.SendMessage(Self, LMessage, True);
end;
end;