QSharedMemory

Alles rund um die Programmierung mit Qt
Antworten
Nightblizard
Beiträge: 39
Registriert: 7. Oktober 2009 20:32

QSharedMemory

Beitrag von Nightblizard »

Grüße,
ich versuche zur Zeit die Instanz einer meiner Klassen im SharedMemory zu hinterlegen, damit ich auf diese über einen anderen Prozess zugreifen kann.
Jedoch erhalte ich beim Auslesen des Speichers immer eine Segmentation-Fault Fehlermeldung.

Der besagte Codeabschnitt sieht wie folgt aus:
(Ich führe das Programm zwei mal aus)

Code: Alles auswählen

    MainWindow* wnd = NULL;

    QSharedMemory sm("35131354353153211");

    if( sm.create(sizeof(MainWindow)) )
    {
        wnd = MainWindow::getWnd();
        sm.lock();
        void* to = sm.data();
        memcpy(to, wnd, sizeof(MainWindow));
        sm.unlock();
    }
    else
    {
        if( sm.attach() )
        {
            sm.lock();
            wnd = static_cast<MainWindow*>( sm.data() );
            sm.unlock();
        }
    }
Ich bin mir nicht sicher was dieses Problem verursacht und hoffe mir kann jemand den rechten Weg weisen!

Dankend,
Night
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Für crashes gibts es wie immer den Debugger der einen sagt wo es crasht...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Beitrag von odt »

Phu, Du versucht Instanzen via Memory zu kopieren, und das ohne die Implementation der MainWindow zu kennen. MainWindow wird wohl irgendwelche Pointer auf "Unterfenster" haben. Diese liegen im Memory-Bereich des Prozesses A. Prozess B wird daher etwas mühe haben. Versuch besser keine grafischen Widget's zu sharen sondern fange mit einer eigenen, simplen Klasse an.

Viel Erfolg!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Stimmt - man kann keine Objekte von einem zu einem anderen Prozess kopieren.
Ich dachte es crasht beim SHM-Zugriff und nicht später beim Zugriff auf wnd ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

naja generell sollt man keine Klassen per speicherkopien bewegen, auch nicht inprocess, solange man den(die) konstruktor(en), die Member und die Logic nicht kennt.
Stell dir mal vor, das ding hat nen lock auf auf ne Ressource oder andere globale Infos.

Klassen die sich per "speicherblock" weitertransportieren lassen sollten, sollten auch eine Serialize funktion oder aehnliches anbieten.

POD's kannst natuerlich per kopie bewegen ... auch ueber Prozessgrenzen, wenn sicherstellst das die definition ueberall gleich ist (Versionierung !)

Ciao ...
Nightblizard
Beiträge: 39
Registriert: 7. Oktober 2009 20:32

Beitrag von Nightblizard »

Dankesehr, jedoch stellt dies ein Problem dar.
Ich möchte Dateien, die mit meinem Programm verknüpft sind, immer im bereits gestarteten Fenster öffnen und keinen neuen Prozess erstellen. Der Shared Memory war einfach zu verlockend, da mir ansonsten nur der steinige Weg des selber implementierens über die einzelnen apis der Betriebssysteme einfällt.
Bietet Qt etwas in dieser Hinsicht an?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dein Programm soll nur einmal gestartet werden? Und wie hätte das mit dem QSharedMemory-Ansatz funktionieren sollen? Es wären immer noch zwei Prozesse vorhanden... :roll:
http://doc.qt.nokia.com/solutions/4/qts ... ation.html sollte helfen...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Nightblizard
Beiträge: 39
Registriert: 7. Oktober 2009 20:32

Beitrag von Nightblizard »

Im Grunde habe ich mir das so vorgestellt:
Fenster öffnen -> auf Instanz prüfen - Wenn nicht vorhanden > Instanz
speichern -> normal weiter machen
- Wenn vorhanden > Instanz kopieren -> instWnd->OpenFiles(argv); -> Prozess beenden

Das ich einen zweiten Prozess nicht gleich beim Start unterbinden kann ist klar, da wird auch QtSingleApplication nichts dran ändern können (schließlich prüft auch das erst im neuen Prozess, ob ein anderer bereits existiert), der Gedanke war das Zeug nicht in einem zweiten Fenster, sondern im bereits vorhandenen, zu öffnen. :roll:

Aber gut, damit scheint es zu funktionieren, danke!
Antworten