Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread: Funktion am Ende wird nicht ausgeführt (https://www.delphipraxis.net/89846-thread-funktion-am-ende-wird-nicht-ausgefuehrt.html)

BillieJoe90 6. Apr 2007 19:28


Thread: Funktion am Ende wird nicht ausgeführt
 
Hallo,
ich habe ein TThread-Objekt mit folgender Execute-Methode:
Code:
procedure TtrdRipAudioCD.Execute;
begin
 // [...] Hier steht sonst der Code zum Rippen eines Audio-Tracks von einer CD

  frmCopyFromCD.ripNextTrack(self.trackNr);
end;
Die Funktion frmCopyFromCD.ripNextTrack() sieht folgendermaßen aus:
Code:
procedure TfrmCopyFromCD.ripNextTrack(lastRippedTrack:Integer);
var i:Integer;
    anotherChecked,isChecked:Boolean;
begin
  anotherChecked := false;
  lastRippedTrack := lastRippedTrack+1;
  for i:=lastRippedTrack+1 to length(currentCD.songs) do begin
    sgrSongs.GetCheckBoxState(0, i, isChecked);
    if isChecked then begin
      ripAudioCD := TtrdRipAudioCD.Create(true);
      ripAudioCD.setTrackNr(i-1);
      ripAudioCD.setDrive(cbxDrives.ItemIndex);
      ripAudioCD.Resume;
      anotherChecked := true;
      break;
    end;
  end;

  if not anotherChecked then
    showMessage('Alle ausgewählten Tracks gerippt!');
end;
Diese Methode wird jedoch scheinbar nicht ausgeführt. Jedenfalls passiert nichts. Auch, wenn ich probeweise nur ein showMessage('blabla') ausführen lasse, passiert nichts. Wenn ich das Programm dann schließe, bekomme ich noch einen Fehler angezeigt "Error Code 1400 Ungültiges Fensterhandle". Über die Suche habe ich herausgefunden, dass das damit zusammenhängt, dass der Thread wohl nicht richtig beendet wurde.

Ich muss dazu sagen, dass die Variable "ripAudioCD" auch der aktuell ausgeführte Thread ist. Da dachte ich sofort, daran, dass ich ja versuche, ripAudioCD wider neu zu belegen, obwohl der Thread noch ausgeführt wird. Aber warum passiert dann selbst nichts, wenn ich NUR showMessage(), ohne andere Befehle, ausführen lasse?!

Ich hoffe, jemand kann mir helfen.

Danke schonmal!

Johannes

Luckie 6. Apr 2007 21:42

Re: Thread: Funktion am Ende wird nicht ausgeführt
 
Die VCL ist nicht threadsafe und das bekommst du mit deiner ShowMessage zu spüren. Nimm eine MessageBox und du solltest sie sehen. Zu deinem anderen Problem, was willst du eigentlich machen? Warum übergibst du dem Thread nicht gleich eine Liste der abzuarbeitenden Dateien?

BillieJoe90 6. Apr 2007 23:12

Re: Thread: Funktion am Ende wird nicht ausgeführt
 
Zitat:

Zitat von Luckie
Die VCL ist nicht threadsafe und das bekommst du mit deiner ShowMessage zu spüren. Nimm eine MessageBox und du solltest sie sehen. Zu deinem anderen Problem, was willst du eigentlich machen? Warum übergibst du dem Thread nicht gleich eine Liste der abzuarbeitenden Dateien?

Hmm... und zu deinem Vorschlag: Eigentlich hast du Recht. Ich wollte aber irgendwie für jeden Track einen seperaten Thread haben.

Ooh... :shock: Ich glaube, mir leuchtet da grad was ein: Wenn ich frmCopyFromCD.ripNextTrack() aufrufe, wird der Code quasi im Thread ausgeführt und nicht in frmCopyFromCD... D.h. ich muss den Code einfach nur in eine Synchronize-Methode einbauen...
Warum bin ich da nicht früher drauf gekommen?! Ich dachte, es wird ein Fehler angezeigt, wenn er nicht auf die VCL zugreifen kann :wall:

Naja... Vielen Dank - wieder eines der für mich zuerst völlig unlösbar scheinenden Probleme gelöst :hello:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz