Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Thread ist mit einer Aufgabe fertig: Mainthread mitteile

  Alt 3. Apr 2008, 08:42
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.
  Mit Zitat antworten Zitat