Zitat von
Dax:
CS.Enter
MT.Daten := irgendwas
Synchronize(TeilFertig)
Aufgabe := Dequeue(Aufgaben)
CS.Leave
Du mischst hier zwei verschiedene Syncronisationsmethoden. Das führt leicht zu einem Stillstand der Anwendung.
Ohne zu bewerten, welche Lösung für dich geeigneter ist, möchte ich dir noch deine eingangs erwähnte Methode über Messages vorstellen:
Du nimmst dir einfach eine dynamische Variable.
Delphi-Quellcode:
type TInfo=....
PInfo=^TInfo;
Im DownloadThread:
Delphi-Quellcode:
//const myMessage=WM_User;
procedure xyz.execute;
var Info:PInfo;
...
//zum senden
new(Info)
Info^:=....
if not postmessage(FMainHandle,myMessage,0,integer(Info)) then
dispose(Info); //Message nicht erfolgreich (sollte nicht auftreten)
Damit hast du deine Information in den Heap gelegt und kannst diese im Mainthread asynchron auslesen.
Delphi-Quellcode:
//zur einfacheren Handhabung wäre noch ein eigener Message-Typ möglich:
type TDTMessage=packed record
Msg:Cardinal;
WParam:LongInt;
Info:PInfo;
Result:LongInt;
end;
type TMainForm=...
procedure getDownloadMessage(var msg:TDTMessage); message myMessage;
//oder
procedure getDownloadMessage(var msg:TMessage); message myMessage;
...
procedure TMainform.getDownloadMessage(var msg:TDTMessage);
begin
try
irgendetwas:=msg.Info^;
finally
dispose(msg.Info);
end;
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.