Seite 1 von 1

QSharedMemory

Verfasst: 31. März 2011 23:06
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

Verfasst: 1. April 2011 06:34
von Christian81
Für crashes gibts es wie immer den Debugger der einen sagt wo es crasht...

Verfasst: 1. April 2011 09:04
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!

Verfasst: 1. April 2011 11:50
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 ...

Verfasst: 1. April 2011 13:05
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 ...

Verfasst: 1. April 2011 20:31
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?

Verfasst: 1. April 2011 20:39
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...

Verfasst: 1. April 2011 22:01
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!