Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [Threads] OnTerminate bei Threads in DLLs (https://www.delphipraxis.net/130336-%5Bthreads%5D-onterminate-bei-threads-dlls.html)

TheMiller 6. Mär 2009 15:31


[Threads] OnTerminate bei Threads in DLLs
 
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

sirius 6. Mär 2009 15:35

Re: [Threads] OnTerminate bei Threads in DLLs
 
Zitat:

Zitat von DJ-SPM
Liegt es daran, dass das PlugIn eine DLL ist? Wenn ja, wie kann ich es so umbauen, dass es trotzdem funktioniert?

Ja!
Wenn TThread in einer DLL benutzt wird funktioniert synchronoize nicht. Und onTerminate wird über synchronize aufgerufen.

TheMiller 6. Mär 2009 15:37

Re: [Threads] OnTerminate bei Threads in DLLs
 
Hm. Was mache ich dagegen? Muss ich zwangsläufig auf Messages umsteigen?

sirius 6. Mär 2009 15:39

Re: [Threads] OnTerminate bei Threads in DLLs
 
Sieht so aus.

TheMiller 6. Mär 2009 15:42

Re: [Threads] OnTerminate bei Threads in DLLs
 
Oder ich merke mir einfach, dass ich solche Sachen immer außerhalb von DLLs mache. Zum Beispiel im Hauptprogramm - wo's ja eigentlich hingehört.

Die nächsten Probleme kämen ja spätestens bei der Fortschrittsanzeige. Ich könnte demnach ja nie synchronize aufrufen - es bleibt ja immer in der DLL.

Btw: Diese Thema hatten wir beide übrigens schonmal. Ist zwar ein bisschen her, aber ich dachte, es gäbe doch einen kleinen Trick, wie das funktionieren könnte.

sirius 6. Mär 2009 16:37

Re: [Threads] OnTerminate bei Threads in DLLs
 
evtl. Trick
Kannst ja mal probieren.

Ich weis grad nicht, ob ich damals auch das onTerminate eingebaut hatte.
Edit: Sieht so aus, als hät' ich.

TheMiller 6. Mär 2009 16:39

Re: [Threads] OnTerminate bei Threads in DLLs
 
Das schaue ich mir gleich mal an.

Aber eine Frage noch. Ich habe den Thread von oben jetzt mal in das Hauptprogramm eingebaut. Nun hängt das Programm immer komplett, nachdem der Thread freigegeben worden ist. Egal auf welche Art und Weise. Wieso ist das so?

sirius 6. Mär 2009 16:42

Re: [Threads] OnTerminate bei Threads in DLLs
 
Hast du deine Messagebox weggeklickt?

TheMiller 6. Mär 2009 16:43

Re: [Threads] OnTerminate bei Threads in DLLs
 
Ja. Aber auch ohne MessageBox / ShowMessage etc. Hängt der Thread.

Auch bei FreeOnTerminate:=True.

TheMiller 6. Mär 2009 16:48

Re: [Threads] OnTerminate bei Threads in DLLs
 
Hier nochmal der Quellcode:

Delphi-Quellcode:
procedure TFOrm1.AfterSeekUpdates(Sender: TObject);
begin
  ShowMessage('SD');
  UpdateSucher.Free; // Hier hängt alles
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  UpdateSucher:=TSeekUpdate.Create(True);
  //UpdateSucher.UpdateHost:='http://www.****.de/Produkte/*****/updates.ini';
  UpdateSucher.OnTerminate:=AfterSeekUpdates;
  UpdateSucher.FreeOnTerminate:=False;
  UpdateSucher.Resume;
end;
Und der Thread

Delphi-Quellcode:
type
  TSeekUpdate = class(TThread)
  private
    fHost: String;
    fVCLForm: TForm;
    function GetVersion(Filename: string): string;
    procedure SetUpdateHost(Value: String);
    procedure SetVCLForm(Value: TForm);
  protected
    procedure Execute; override;
  published
    property UpdateHost: String read fHost write SetUpdateHost;
    property VCLForm: TForm read fVCLForm write SetVCLForm;
  end;

procedure TSeekUpdate.Execute;
var
  www: TIdHttp;
  memini: TMemInifile;
  updates, entries: TStrings;
  i: Integer;
  filepath: String;
  inidir: String;
  inifile: String;
  iniversion: String;
  localversion: String;
begin
  inherited;
  //alles auskommentiert
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:43 Uhr.
Seite 1 von 2  1 2      

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