AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Callback von Thread wird aus DLL-Form nicht aufgerufen
Thema durchsuchen
Ansicht
Themen-Optionen

Callback von Thread wird aus DLL-Form nicht aufgerufen

Ein Thema von TheMiller · begonnen am 22. Feb 2008 · letzter Beitrag vom 22. Feb 2008
Antwort Antwort
Benutzerbild von TheMiller
TheMiller

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

Callback von Thread wird aus DLL-Form nicht aufgerufen

  Alt 22. Feb 2008, 00:55
Ich bin am Verzweifeln!!!

Ich habe eine Hauptanwendung und Plugins als DLL mit DLL-Forms. Nun binde ich per Windows.SetParent die DLL-Form in einen Bereich der Hauptanwendung ein.
In diesem DLL-Form habe ich nun eine Thread-Unit, erstelle einen Thread, welcher ein Callback auslösen soll, wenn er beendet wird. Generell funktioniert das auch - nur nicht aus DLL-Formularen.

Der Thread läuft aber trotzdem, es wird nur eben nicht das Callback ausgelöst.

Hier mal relevante Codes:

Thread-Unit

Delphi-Quellcode:
type
  TMyThread = class(TThread);
  public
    constructor Create(Callback: TNotifyEvent);
...
...
...

constructor TMyThread.Create(CallBack: TNotifyEvent);
begin
  inherited Create(True);
  OnTerminate:=Callback;
  FreeOnTerminate:=True;
end;
DLL-Form: Callback für Thread

Delphi-Quellcode:
procedure Fertig(Sender: TObject);
..
..
procedure TForm1.Fertig(Sender: TObject);
begin
  ShowMessage('SD');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  th: TMyThread;
begin
  th:=TMyThread.Create(Fertig);
  th.Resume;
end;
Hauptformular: DLL-Form einbinden
Delphi-Quellcode:
  Hndl:=PlugIn[High(PlugIns)].PlugInName.SendFormHandle;
  Windows.SetParent(Hndl, Panel1.Handle);
  SetWindowPos(hndl, hwnd_top, 0, 0, 0, 0, SWP_NOSIZE);
Wenn ich die Thread-betreffenden Zeilen in ein neues Projekt oder in andere Projekte implentiere, dann funktioniert das sehr schön! Warum nich auch so?

Ich hoffe ihr könnt mir helfen. Sitze nun seit 7 Stunden an dem Problem!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Callback von Thread wird aus DLL-Form nicht aufgerufen

  Alt 22. Feb 2008, 02:56
Du selbst nutzt ja schon SetParent anstatt die Instanz direkt zu übergeben. Du scheinst somit schon um die Problematik der Typeninformationen, Instanzenübergabe etc zu wissen. Somit wundere ich mich, dass du dich nun wunderst, dass es hier nicht klappt.

Abhilfe: Trigger ein Event, Sende eine Windowsbotschaft ab oder einer der vielen anderen Möglichkeiten anstatt dein Weg.
  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: Callback von Thread wird aus DLL-Form nicht aufgerufen

  Alt 22. Feb 2008, 11:02
Naja, ich habe mich zwar informiert, aber letztenendes kam die Lösung auch hier aus dem Forum. Ich habe nix dagegen, wenn du die angesprochenen Thematiken nochmal kurz anschneidest.

Zur Lösung: Wenn ich dich richtig verstanden habe meinst du, ich am Ende des Threads besser eine Windows-Message senden, als eine callback-Funktion aufzurufen? Ist das so richtig?

Danke
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

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

Re: Callback von Thread wird aus DLL-Form nicht aufgerufen

  Alt 22. Feb 2008, 14:04
Also ich habe das mit der Windows-Botschaft jetzt probiert, aber das klappt auch nicht. Habe die obige Antwort jetzt mehrmals gelesen, werde aber daraus irgendwie auch nicht schlauer.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: Callback von Thread wird aus DLL-Form nicht aufgerufen

  Alt 22. Feb 2008, 14:09
Wir rufst du denn die CallBack-Methode auf?
Wenn du es über synchronize machst, dann klappt das nicht. Wenn du einen Thread in einer DLL benutzt, dann geht das Konzept von synchronize nicht. Evtl. reicht es die Application-Variable von der DLL auf die der Exe umzubiegen, aber nur vielleicht.


Edit: Du benutzt ja onTermiante. OnTerminate wird eben mit synchronize aufgerufen. Dadurhc entsteht obiges Problem.
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
 
#6

Re: Callback von Thread wird aus DLL-Form nicht aufgerufen

  Alt 22. Feb 2008, 14:18
Also, ich kann dazu nicht viel sagen - Threads sind noch relativ neu für mich. Jedenfalls klappt es mit Messages doch. Hatte nur das falsche Handle. Trotzdem wäre ich für eine Erklärung dankbar, warum die Callback-Methode nicht aus der DLL aufgerufen wird.

Danke
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: Callback von Thread wird aus DLL-Form nicht aufgerufen

  Alt 22. Feb 2008, 19:39
Kurz (Das Problem mit der Synchronisation hatten wir ja schon):
Die Methode in OnTerminate wird über synchronize aufgerufen (Delphi: "synchronize(OnTerminate)") Sie soll also synchronisiert aufgerufen werden. Der Thread soll schlafen während der MainThread die Methode ausführt.
Dazu wird der Methodenzeiger aus OnTerminate an eine Liste angehangen und dem Mainthread eine Nachricht gesendet, dass in der Liste wieder eine Methode drin steht. Der Mainthread tut dann bei der nächsten Gelegenheit die Methode ausführen. So weit So gut. Dummerweise haben die EXE und die DLL jeweils eine eigene Liste (ist eine globale Variable). du hängst also die Methode an die Liste in der DLL und de rMainthread sucht in der Liste aus der EXE nach neuen Methoden. Das klappt halt nicht. Wobei selbst die Message an die falsche Instanz von Tapplication gesendet wird. Denn auch die EXE und die DLL haben hier zwei verschiedene Instanzen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:38 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