AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) DLL und Callback-Funktion: Hostprogramm reagiert nicht?

DLL und Callback-Funktion: Hostprogramm reagiert nicht?

Ein Thema von romber · begonnen am 28. Mai 2013 · letzter Beitrag vom 30. Mai 2013
Antwort Antwort
Seite 1 von 2  1 2   
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#1

DLL und Callback-Funktion: Hostprogramm reagiert nicht?

  Alt 28. Mai 2013, 23:25
Hallo!

Ich probiere es gerade mit DLLs, indem ich tesweise ein Add-On für mein Programm erstelle. In der DLL habe ich einen Thread mit dem TCP-Client, der sich mit dem Remote-Server verbindet und sehr viele Daten empfängt. Jeder Datensatz wird einer Callback-Funktion (im Hostprogramm) als Parameter übergeben. Diese Funktion wandelt dann die Daten in einem Objekt um und zeigt die Daten an. Wie gesagt, das Ganze nur zum Zwecke des Lernens.

Alles funktioniert ganz gut, solange die empfangenen Daten jeweils aus einem Datensatz bestehen und somit einzeln an die Callback-Funktion übergeben werden. Manchmal wenn der Datenaufkommen zu groß ist (oder warum auch immer) sendet der Server mehrere Datensätze auf einmal zu. In diesem Fall (um die Datenstau zu vermeiden) leitet der Client einen neuen Thread ab, der die Daten auffängt, aufteilt und einzeln der Callback-Funktion übergibt. Funktioniert auch. Das Problem tritt auf, wenn der Server mehrere "große" Datensätze hintereinander schickt und somit mehrere Threads hintereinander abgeleitet werden und sich gleichzeitig der Callback-Funktion bedienen. Dann friert das Hostprogramm plötzlich ein und reagiert nicht mehr. Es erscheint auch entsprechende Windows-Meldung, dass Programm nicht mehr reagiert.

Gibt es etwas, was ich beachten soll wenn ich
- Threads in der DLL erstelle
- die Callback-Funktion aus mehreren Threads in der DLL gleichzeitig aufrufe?

Sicherlich habe ich etwas nicht beachtet oder irgenwelche allgemeine Regel missachtet, die für soche Fälle üblich ist. Ich freue mich über jeden Hinweis.
Vielen Dank!
Miniaturansicht angehängter Grafiken
screenshot.png  

Geändert von romber (28. Mai 2013 um 23:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?

  Alt 28. Mai 2013, 23:39
- die Callback-Funktion aus mehreren Threads in der DLL gleichzeitig aufrufe?
Ist die Callback-Funktion thread-safe? Also: Gibt es keine Race Conditions oder Deadlocks?
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.

Geändert von BUG (28. Mai 2013 um 23:41 Uhr)
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?

  Alt 29. Mai 2013, 00:15
Ist die Callback-Funktion thread-safe? Also: Gibt es keine Race Conditions oder Deadlocks?
Ich denke schon. In der Callback-Funktion wird lediglich ein XML-Parser (himXML, danke an himitsu) erzeugt und mit übergebenen Daten gefühlt. Dann wird ein neues einfaches Objekt erstellt, dem die Values aus den XML-Nodes zugewiesen werden. Am Ende wird das neue Objekt einer Objektliste hizugefügt, natürlich geschützt mit TCriticalSection.

Aber auch wenn ich eine ganz einfache Callback-Funktion erstelle, in der ich die Daten einfach in einem TMemo anzeigen lasse, tritt der Fehler trotzdem auf.
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#4

AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?

  Alt 29. Mai 2013, 10:55
Das Problem ist immer noch da
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.288 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?

  Alt 29. Mai 2013, 11:14
Aber auch wenn ich eine ganz einfache Callback-Funktion erstelle, in der ich die Daten einfach in einem TMemo anzeigen lasse, tritt der Fehler trotzdem auf.
Mit Synchronize natürlich?

Hast du Fehler in deinen Threads denn auch schön ordentlich mit einem try..except außen herum abgefangen? Denn Exceptions in Threads, die nicht abgefangen werden, können sich genau so äußern. (Anderswo auch, aber in Threads ist das besonders schlecht.)

Und dann gibt es da auch noch Tools wie MadExcept oder Eurekalog, die solche Exceptions abfangen und dir mitteilen wo das Problem aufgetreten ist.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#6

AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?

  Alt 29. Mai 2013, 11:52
Mit Synchronize natürlich?
Nein. Wenn ich in der DLL den Aufruf der CallBack-Funktion in eine neue Thread-Prozedur auslagere und diese mit Synchronize aufrufe, passiert nichts. Ich meine, die Prouedur wird gar nicht aufgerufen.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.288 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?

  Alt 29. Mai 2013, 12:03
Ah. Du versuchst das Synchronize in der DLL. Das geht so nicht, denn da fehlt der Aufruf von CheckSynchronize. Das musst du z.B. über eine exportierte Funktion der DLL aus deinem Hauptprogramm heraus in ApplicationEvents.OnIdle aufrufen.

Da das bisher nicht aufgerufen wird, wird dein Synchronize nie abgearbeitet...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#8

AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?

  Alt 29. Mai 2013, 12:23
Ah. Du versuchst das Synchronize in der DLL. Das geht so nicht, denn da fehlt der Aufruf von CheckSynchronize. Das musst du z.B. über eine exportierte Funktion der DLL aus deinem Hauptprogramm heraus in ApplicationEvents.OnIdle aufrufen.

Da das bisher nicht aufgerufen wird, wird dein Synchronize nie abgearbeitet...
Ok. bevor ich jetzt wieder etwas falsch mache: ich erstelle jetzt eine neue Funktion in der DLL mit der Zeile CheckSynchronize , exportiere diese und rufe in der Hostaufendung einmal auf. Dann kann ich aus der DLL heraus mit dem hostprogramm synchronisiert. Richtig?
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#9

AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?

  Alt 29. Mai 2013, 13:03
Habe ich jetzt gemacht wie oben beschrieben. Hat sich nichts geändert. Die mit Synchronize augerufene Prozedur wird nicht ausgeführt.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.093 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?

  Alt 29. Mai 2013, 13:20
Nochmal von vorne...
  1. Client "Hauptprogramm" bindet DLL ein
  2. Hauptprogramm erzählt der DLL, welche Funktion es später einmal aufrufen soll, wenn es Datenmengen abzugeben hat
  3. Die DLL tut viele Dinge, darunter auch mehrere Threads öffnen
  4. Mehrere der Threads aus der DLL entscheiden sich nun innerhalb einer kurzen Zeitspanne, die Datenablieferungsfunktion aufzurufen
  5. Die Funktion soll erst einmal nichts anderes tun, als die Daten, die sie übergeben bekommt, als Text in eine Memo zu werfen

Alles richtig bis hier?

Wenn ich zumindest das Problem verstehe, dann ist es die Tatsache, dass (der Thread aus) der DLL mit der ganzen VCL-Geschichte des Hauptprogramms nichts am Hut hat. Und somit beispielsweise auch erst garnichts im Kontext des Hauptthreads ausführen kann. Richtig?

Ich würde die Datenablieferungsfunktion so bauen, dass hier Daten einfach nur abgelegt werden. Beispielsweise in einer verketteten Liste (natürlich entsprechend geschützt, z.B. mit einem kritischen Abschnitt). In deinem Hauptprogramm würde ich z.B. jede halbe Sekunde hingehen und schauen, ob mittlerweile neue Daten vorliegen. Wenn ja, kann man die ja anzeigen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:11 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