Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Multithreating und DLLs, seltsamer Fehler mit OmniThreadLibrary (https://www.delphipraxis.net/170212-multithreating-und-dlls-seltsamer-fehler-mit-omnithreadlibrary.html)

geskill 5. Sep 2012 16:22

Multithreating und DLLs, seltsamer Fehler mit OmniThreadLibrary
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hey,
ich hatte vor ein paar Tagen ja kleines Projekt von mir hochgeladen, den HTTPManager. Nun bin ich dabei dies in DLLs zu nutzen, wobei der HTTPManager im eigentlichen Hauptprogramm erstellt wird (als Singelton) und die DLL nur eine Interface-Instanz davon bekommt.

Wenn die DLL nun die "erste" Singelton Instanz bekommt, dann gibt es am Programmende einen Fehler (sonst nicht, also wenn sie im Hauptthread erstellt wird):
Zitat:

Zitat von Fehlermeldung
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EOSError mit der Meldung 'Systemfehler. Code: 1400.
Ungültiges Fensterhandle' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Zitat:

Zitat von Aufruf-Stack
OtlTaskControl.TOmniTask.InternalExecute(???)
OtlTaskControl.TOmniTask.Execute
OtlThreadPool.TOTPWorkerThread.ExecuteWorkItem(??? )
OtlThreadPool.TOTPWorkerThread.Execute

Ich könnte mir auch vorstellen, dass es ein Fehler in der OmniThreadLibrary ist, aber mein Multithreating wissen ist noch sehr spärlich, deshalb glaube ich eher ich mache hier irgendwas falsch.

Um den Fehler zu umgehen könnte man natürlich generell einfach folgendes in der Datei für das Singelton Interface machen:
Delphi-Quellcode:
initialization
  TApiHTTPManager.GetInstance;

Zuvor hatte ich noch einen Fehler, dass die Informationen für einen Request die in der DLL erstellt werden (HTTPRequest, HTTPOptions) nicht mehr freigegeben wurden und es zu weiteren Fehler kam. Dies habe ich gelöst, indem ich die Interfaces kopiert habe. Das habe ich alles händisch gemacht und mir dafür Clone Konstruktoren erstellt. Kann man dies nebenbei vielleicht irgendwie vereinfachen?

Generell stellt sich mir auch die Frage ist das alles so sauber umgesetzt, gibt es Stellen die problematisch sind und was könnte man vielleicht leichter anders besser machen?

Ich habe das komplette Demo Programm im Anhang und versucht alle unwichtigen Teile zu entfernen, trotzdem kann es im ersten Moment etwas unübersichtlich aussehen, deshalb noch eine Grafik in der Hoffnung das es das Verständnis vereinfacht.

Ich selber benutze D2010 aber mit 2009 sollte man es auch noch kompilieren können.

Grüße und schonmal vielen Dank im voraus!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 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