Speicherfresser

Alles rund um die Programmierung mit Qt
Antworten
MandyW
Beiträge: 3
Registriert: 27. Juni 2017 15:25

Speicherfresser

Beitrag von MandyW »

Hallo,

ich bin Entwickler eines Kundenverwaltungsprogrammes. Dieses Projekt habe ich geerbt, leider kann ich
keinen mehr Fragen, die dieses ursprünglich entwickelt haben.

Nun zu meinem Problem beim Öffnen einer QML werden ca. 90 MB in den Speicher geladen. Die Informationen
wie beim Knopfdruck, Feldeingabe oder ähnliches vorgaben werden soll wird aus einer SQL Datenbank
geholt. Ohne irrgendeine Eingabe wird die Maske wieder geschlossen, aber die 90 MB bleiben im Speicher.
Erst wenn die komplette Anwendung geschlossen wird der Speicher wieder frei gegeben.

Ich arbeite mit dem QT5.9 und unter Windows.

Die jeweilige QML wird über C++ gestartet und auch wieder geschlossen. Hat jemand eine Idee wie ich den
Übeltäter finde, der mir meinen Speicher raubt?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Speicherfresser

Beitrag von Christian81 »

Linux: valgrind
Wobei es kein Speicherfresser ist - C++ und vor allem OpenGL allokieren Speicher der bei der Freigabe nicht wieder ans OS zurückgegeben wird.
Problematisch wäre es, wenn der Speicher ständig immer weiter ansteigen würde.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
MandyW
Beiträge: 3
Registriert: 27. Juni 2017 15:25

Re: Speicherfresser

Beitrag von MandyW »

Danke für die schnelle Antwort.
Ist es möglich mit valgrind eine Windowsanwendung zu prüfen?

Ich habe genau das Problem, mit jedem öffnen einer QML wird mir der Speicher gefressen und nach ca 20 bis 25 Masken öffnen und schließen ist es vorbei und das Programm stürzt ab.
MandyW
Beiträge: 3
Registriert: 27. Juni 2017 15:25

Re: Speicherfresser

Beitrag von MandyW »

Da ich mein Problem noch immer nicht gelöst habe versuche ich mal weiter:
Meine Masken öffne ich so:

Code: Alles auswählen

TMaskeD*  maske = new TMaskeD( this, this, resource, maskId, flags );
if( maske->isComponentReady() )
{
  maske->Create();
  maske->Execute();
  m_dialogs.push_back(maske);
}
In der Kasse wird dieses getan:

Code: Alles auswählen

m_engine = new QQmlEngine();
m_engine->rootContext()->setContextProperty( "xxx", QVariant::fromValue( this ) );

m_component = new QQmlComponent( m_engine, QUrl(m_dlgResourceName) );
Im Create dieses:

Code: Alles auswählen

m_visual = m_component->create();
Das Schließen wird so ausgelöst:

Code: Alles auswählen

QMetaObject::invokeMethod( m_visual, "close", Qt::QueuedConnection );
Am Destruktor von TMaskeD kommt man vorbei.

Muss noch mehr getan werden, damit die QML aus dem Speicher entfernt wird, oder sollte dieses reichen?
Vielleicht kann mir ja doch noch jemand helfen.

Danke
Mandy
Antworten