Pointer-Problem



  • Hey Leute.
    Ich habe eine Klasse, zum Erstellen einer vereinfachten GUI. In der WinMain-Funktion erstelle ich ein Objekt zu dieser Klasse und möchte dann einen Pointer auf das Objekt an eine andere Funktion weiter geben (an einen Thread) und dort dann für den Benutzer benutzbar machen.
    In Code sähe das ganze dann so aus:

    // core.h
    int WINAPI WinMain(...)
    {
        GUI gui("Fenstertitel");
        CreateThread(0, 0, MainFunktion, &gui, 0, 0);
        return gui.MessageLoop();
    }
    
    // main.cpp
    DWORD WINAPI MainFunktion(void* gui)
    {
        gui->new_button("Klick mich!");
    }
    

    Mein Problem ist es, dass er einfach keinen neuen Button erstellt, während, wenn ich das ganze ohne Pointer/Thread mache (sondern einfach die Funktion MainFunktion aufrufe und die gui als Objekt übergebe) der Button wie gewollt erstellt wird.
    Hab ich das mit den Pointern noch nicht verstanden, oder was mache ich falsch?

    MFG DerCoder



  • Das kann ja so auch überhaupt nicht fehlerfrei kompilieren, da fehlt mindestens noch ein cast in der MainFunktion (wegen dem void*).
    Ich kenne zwar die GUI nicht, aber meistens ist es so, daß GUI-Methoden nur in einem Thread (d.h. dem Hauptthread) aufgerufen werden dürfen (d.h. wenn die GUI nur ein Wrapper um die WinAPI ist, dann ist es definitiv so!).

    Welchen Sinn verfolgst du überhaupt mit dem Thread?



  • Ja den cast hab ich drin, nur vereinfacht hier gepostet.. Sry
    Ehm ich wollte dann die Userfunktionen in einen Thread machen, damit er seine Funktionen und so unabhängig von der GUI aufrufen kann.

    Hab das mit dem Thread rausgelassen und die Funktion so aufgerufen. Jetzt klappt es -.-
    Verstanden hab ichs trotzdem nicht.



  • meistens ist es so, daß GUI-Methoden nur in einem Thread (d.h. dem Hauptthread) aufgerufen werden dürfen (d.h. wenn die GUI nur ein Wrapper um die WinAPI ist, dann ist es definitiv so!

    Naja, ne, das ist definitiv nicht so.

    Unter Windows gibt es schonmal keinen Haupt-Thread per se.

    Was auch völlig problemlos funktioniert, ist, verschiedene, von einander unabhängige Top-Level Fenster in verschiedenen Threads zu haben. (von einander unabhängige = sie kommunizieren nicht miteinander)

    Was meistens noch "gut" geht: wenn die Fenster nur per PostMessage/SendNotifyMessage miteinander kommunizieren.

    Aber es wird sehr schnell sehr kompliziert, wenn man synchron Messages zwischen Fenstern verschiedener Threads schicken muss (SendMessage). Und bei Parent/Child Beziehungen macht Windows das an diversen Stellen selbst, was dann schnell zu nem Deadlock führen kann.


Anmelden zum Antworten