Einzelnen Beitrag anzeigen

Benutzerbild von Gina
Gina

Registriert seit: 23. Dez 2004
Ort: Berlin
161 Beiträge
 
Delphi 6 Professional
 
#1

TThread - Synchronize läuft erst danach?

  Alt 31. Mär 2005, 19:30
Hallochen,

ich hab da ein kleines Problem, wo ich mir hinterher wahrscheinlich an den Kopf schlage, aber momentan komm ich einfach nicht dahinter...

Ich habe einen Thread erzeugt, um dort eine function auszuführen, die etwas länger dauert. Genauer gesagt: in dieser function wird eine CD-RW formatiert. Ich klicke also im Menü des Hauptformulars auf einen Eintrag, um die Formatierung zu starten. Dann wird ein kleines Fenster angezeigt, wo die verbleibende Zeit erscheinen soll. Während Synchronize wird das kleine Fenster aktualisiert. Ich starte also den Thread (das klappt auch wunderbar), nur Synchronize wird erst aufgerufen, wenn die Formatierung beendet ist.

Mein Problem ist also: wie muss ich es anstellen, dass Synchronize während dessen ausgeführt wird?

Hier mal die entscheidenden Code-Schnipsel dazu:

Im HauptFormular:
Delphi-Quellcode:
type
  TMain = class(TForm)
  ...
  private
    { Private declarations }
    MyThread:TMyThread;
    procedure ThreadDone(Sender: TObject);

procedure TMain.CDRW1Click(Sender: TObject);
begin
  Main.Enabled := false;
  PBar.Show;
  if Application.MessageBox('Alle Dateien auf der CD werden glöscht! '
     +#13#10+ 'Möchten Sie fotfahren?',
     'Warnung!', MB_YESNO + MB_DEFBUTTON2) = IDYES then begin
  if MyThread = nil then
     with TMyThread.Create(PBar.Label1, Brennen.NeroDeviceHandle) do
     OnTerminate := ThreadDone;
  end;
end;

procedure TMain.ThreadDone(Sender: TObject);
begin
  PBar.Hide;
  Main.Enabled := true;
  Main.Show;
end;
PBar ist das kleine Fenster (ursprünglich war dort eine Progressbar, daher der Name ).

In der unit des Threads:
Delphi-Quellcode:
type
  TMyThread = class(TThread)
  private
    { Private declarations }
    L1: TLabel;
    NDH: NERO_DEVICEHANDLE;
    TimeA: Cardinal;
    procedure UpdateVCL; // Update ProgressBar
  protected
    procedure Execute; override;
    function EraseRW(Sender: TObject): Boolean;
  published
    constructor Create(Label1: TLabel; NeroDeviceHandle: NERO_DEVICEHANDLE);
  end;

constructor TMyThread.Create(Label1: TLabel; NeroDeviceHandle: NERO_DEVICEHANDLE);
begin
  L1 := Label1;
  NDH := NeroDeviceHandle;
  FreeOnTerminate := true;
  inherited Create(False);
end;

procedure TMyThread.Execute;
begin
  EraseRW(self); //<--- das ist die eigentliche function, die so lange dauert
  while (Terminated = false) do begin
    Synchronize(UpdateVCL);
  end;
end;

procedure TMyThread.UpdateVCL;
begin
  L1.Caption := 'geschätzte Zeit: '+ FormatDateTime('mm:ss',ETime);
  L1.update;
end;
Ich kann ja schlecht EraseRW() in die while-Schleife setzen, also hab ich es davor gesetzt. Logischerweise wird die function nun zuerst abgearbeitet, bevor er in die while-Schleife kommt... Warum dass so läuft, ist mir also klar. Nur wie schreibe ich es, damit Synchronize zwischendurch ausgeführt wird?

Wie gesagt, ist wahrscheinlich ganz banal, aber ich würde mich sehr freuen, wenn ihr mir einen kleinen Denkanstoß geben könntet...

Tausend Dank, Gina.
Mein Lieblings-Spiele-Laden in Berlin: www.cometgames-store.de

{KDT}
.
  Mit Zitat antworten Zitat