Einzelnen Beitrag anzeigen

Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

[Threads] OnTerminate bei Threads in DLLs

  Alt 6. Mär 2009, 16:31
Hallo Leute,

bin immernoch an der Thread-Problematik dran. Ich habe grad das Problem, dass die OnTerminate-Methode nicht aufgerufen wird.
Hier mal meine Programmstruktur, bevor ich Quelltext poste:

Also, ich habe das Hauptprogramm mit der Navigation links. Rechts ist ein großes Panel, in welchem die PlugIns angezeigt werden. Mit Klick auf einen Navigationseintrag wird das entsprechende DLL geladen und im Panel dessen Form angezeigt. Das war's eigentlich schon.

Nun habe ich ein Update-Plugin. Es wird auch im Panel angezeigt und es arbeitet auch. Doch Ereignisse aus der DLL-Form, die mit dem Thread verknüpft sind, werden nicht ausgeführt - so auch das OnTerminate-Ereignis nicht. Sogar dann nicht, wenn es im Thread selbst ist.

Der Thread an sich ist eine eigenständige Unit. Hier mal Quelltext:

- Form1 des Update-Plugins
Delphi-Quellcode:
procedure TForm1.DLFinished(Sender: TObject);
begin
  ShowMessage('SD');
end;

procedure TForm1.PngBitBtn2Click(Sender: TObject);
var
  UpdateSucher: TSeekUpdate;
begin
  UpdateSucher:=TSeekUpdate.Create(true);
  UpdateSucher.UpdateHost:='http://meinehp.de/Produkte/programmname/updates.ini';
  UpdateSucher.VCLForm:=Form1;
  UpdateSucher.OnTerminate:=DLFinished;
  UpdateSucher.FreeOnTerminate:=True;
  UpdateSucher.Resume;
end;
Delphi-Quellcode:
type
  TSeekUpdate = class(TThread)
  private
    fHost: String;
    fVCLForm: TForm;
    function GetVersion(Filename: string): string;
    procedure SetUpdateHost(Value: String);
    procedure SetVCLForm(Value: TForm);

    procedure Test(Sender: TObject);
  protected
    procedure Execute; override;
  published
    property UpdateHost: String read fHost write SetUpdateHost;
    property VCLForm: TForm read fVCLForm write SetVCLForm;
  end;

procedure TSeekUpdate.Test(Sender: TObject);
begin
  MessageBox(VCLForm.Handle, PChar('Hallo'), PChar('hallo'), 0); // Diese Box erscheint auch nicht.
end;

procedure TSeekUpdate.Execute;
var
  ...
begin
  inherited;
  Self.OnTerminate:=Test; //das zum Test, da "DLFinishes" in Form1 nicht aufgerufen wurde.
end;
Liegt es daran, dass das PlugIn eine DLL ist? Wenn ja, wie kann ich es so umbauen, dass es trotzdem funktioniert?

Danke
  Mit Zitat antworten Zitat