Hallo zusammen,
ich habe ein Problem, das sich für mich als ziemlich undurchsichtig erweist:
Ich habe einen Thread erstellt, der ein externes Programm startet und auf dessen Beendigung wartet. Danach soll sich der Thread beenden
Allerdings terminiert der Thread nicht, auch wenn die im OnTerminate zugewiesene "Aktion" abgearbeitet ist.
Delphi-Quellcode:
type TDemuxThread = class(TThread)
private
FMPGFileContainer : TMPGFileContainer;
protected
procedure Execute; override;
public
constructor Create;
property Terminated;
property MPGFileContainer: TMPGFileContainer
read FMPGFileContainer write FMPGFileContainer;
end;
...
constructor TDemuxThread.Create;
begin
inherited Create(true);
FMPGFileContainer := nil;
end;
[gekürzt]
Delphi-Quellcode:
procedure TDemuxThread.Execute;
begin
if Assigned(FMPGFileContainer) then
begin
FMPGFileContainer.Files.Items[DemuxIndex].Demux;
// MessageDlg('Blubb', mtError, mbYesNo, 0); //-> auskommentiert wegen Antwort 2
end;
end;
Was im Execute steht, ist völlig unerheblich für mein Problem, ändert nichts daran. Egal ob alles im Execute steht oder gar nichts, das Problem bleibt bestehen (warum auch nicht
)
Dieses FMPGFileContainer.Files.Items[DemuxIndex].Demux; öffnet im Grunde per ShellExecAndWait ein externes Programm (DGIndex.exe) und wartet per WaitForSingleObject auf dessen Ende.
Die MessaegBox Blubb poppt ohne Probleme auf
Der Aufruf sieht folgendermaßen aus:
Delphi-Quellcode:
procedure TfMain.btInputDemuxSelClick(Sender: TObject);
begin
if not Assigned(DemuxThread) then
begin
DemuxThread := TDemuxThread.Create;
DemuxThread.MPGFileContainer := MFC;
DemuxThread.OnTerminate := DemuxTerminate;
DemuxThread.Resume;
end;
end;
und die DemuxTerminate sieht so aus [gekürzt]:
Delphi-Quellcode:
procedure TFMain.DemuxTerminate(Sender:TObject);
begin
// MessageDlg('wir sind im OnTerminate',mterror,mbyesno,0);//-> auskommentiert wegen Antwort 2
end;
Auch diese MessageBox 'wir sind im onTerminate' poppt auf.
Im CloseQuery schaue ich nach, ob der Thread terminiert ist, denn nur dann darf ich das Programm schließen
Delphi-Quellcode:
procedure TfMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
canclose := true;
if not DemuxThread.Terminated then
canclose := false;
end;
Und genau dort hänge ich immer fest. Die Aktion im OnTerminate wurde ausgeführt, alo müsste der Thread doch jetzt terminated sein, oder nicht? Warum also zm Kuckuck kann ich das Programm nicht schließen
gekürzter Quelltext heißt: Es steht noch mehr drin, das habe ich aber alles bei mir schon auskommentiert und hier aus Übersichtlichkeit weggelassen
Nochmal zusammenfassend:
Alles im Thread.Execute wird ohne Probleme ausgeführt.
Aiuch die Anweisungen im Thread.OnTerminate (=DemuxTerminate) werden ausgeführt
Aber mein Thread terminiert danach nicht. Warum?
p.s. ab und zu sieht die 'Blubb' MessageDlg verkrüppelt aus, so wie im Bild, hat das etwas mit dem Problem zu tun?
[edit]
MessageBoxen auskommentiert wegen Antwort 2, jedoch ohne Nutzen
[/edit]