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.