AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[Threads] OnTerminate bei Threads in DLLs

Ein Thema von TheMiller · begonnen am 6. Mär 2009 · letzter Beitrag vom 6. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
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, 15: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
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: [Threads] OnTerminate bei Threads in DLLs

  Alt 6. Mär 2009, 15:35
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

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

Re: [Threads] OnTerminate bei Threads in DLLs

  Alt 6. Mär 2009, 15:37
Hm. Was mache ich dagegen? Muss ich zwangsläufig auf Messages umsteigen?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: [Threads] OnTerminate bei Threads in DLLs

  Alt 6. Mär 2009, 15:39
Sieht so aus.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

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

Re: [Threads] OnTerminate bei Threads in DLLs

  Alt 6. Mär 2009, 15:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: [Threads] OnTerminate bei Threads in DLLs

  Alt 6. Mär 2009, 16:37
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

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

Re: [Threads] OnTerminate bei Threads in DLLs

  Alt 6. Mär 2009, 16:39
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?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: [Threads] OnTerminate bei Threads in DLLs

  Alt 6. Mär 2009, 16:42
Hast du deine Messagebox weggeklickt?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

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

Re: [Threads] OnTerminate bei Threads in DLLs

  Alt 6. Mär 2009, 16:43
Ja. Aber auch ohne MessageBox / ShowMessage etc. Hängt der Thread.

Auch bei FreeOnTerminate:=True.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

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

Re: [Threads] OnTerminate bei Threads in DLLs

  Alt 6. Mär 2009, 16:48
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz