Speicherproblem mit DCOM und Interface



  • ich arbeite gerade an einem Programm, das mit einem anderen Programm über die DCOM-Schnittstelle kommuniziert und soll es erweitern, hab aber ein problem.

    wie es war:

    ein programm implementiert eine TComponent, welche über ein Interface mit dem anderen (Server)Programm kommuniziert, wird das programm geschlossen, wird die DCOM schnittstelle geschlossen und auch der server beendet. (das alles sind existierende vorgänge, auf die ich fast keinen einfluss habe)

    so soll es sein:

    ich soll ein neues programm entwickeln welches über sockets mit clients kommuniziert. die clients sollen dabei mit einer neuen TComponent arbeiten, welche kompatibel zu der alten ist.
    Die neue komponente stellt eine TCP verbindung her und öffnet einen thread an meinem neuen server, dieser holt sich eine instanz des interface und kommuniziert darüber mit dem eigentlichen server.

    das problem ist nun, wenn ich methodenaufrufe über das interface mache entsteht aus mir unerfindlichen gründen ein gewisses speicherloch, der speicherbedarf meines programmes wächst.
    bisher war das kein problem da die main unit und damit das interface gelöscht wurde nach dem beenden...
    nun allerdings besteht weiterhin eine main unit und nur die thread unit die das server interface erzeugt hat wird gelöscht.
    trotz des delete bleibt der speicher aber belegt, was nach ca. 12h dauerbetrieb mit 2 clients zu einer speicherlast von 200mb geführt hat, völlig inakzeptabel!!

    wenn ich Intf->Release(); ausführe, steigt mein programm beim deleten der thread-unit aus, esbefindet sich dabei im TCOMInterface und versucht den Destruktorauszuführen.

    Am liebesten würde ich einfach den Quellcode präsentieren aber das ist mir hier leider untersagt



  • ich habe die quelle eingegrenzt, wenn ich eine bestimmte methode aus dem interface ausführe (und WENN diese einen übergebenen VARIANT verändert), erhöht sich die speicherauslastung.
    ich habe bisher leider nicht herausgefunden wie ich das Interface deinitialisieren kann, denn der belegte speicher wird nicht wieder freigegeben



  • Für den fall das es irgendwann mal jemand interessiert, der Variant sollte IMMER initialisiert werden, wird er nicht mit VariantClear(&var) gelöscht, bleibt der speicher belegt auch wenn die klasse gelöscht wird.


Anmelden zum Antworten