Einzelnen Beitrag anzeigen

silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#1

[solved]Thread terminated nicht, obwohl OnTerminate

  Alt 10. Apr 2008, 20:40
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]
Miniaturansicht angehängter Grafiken
fehler_153.jpg  
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat