View aus Thread heraus aktualisieren



  • Hallo ...

    ich habe in einer Doc-View-Architektur eine weitere Klasse angelegt, in der ein Thread aufgerufen wird.
    In dem Thread werden dann Daten aus Files in einem Intervall eingelesen.
    Die eingelesenen Daten möchte ich nun in einer Listbox im View darstellen.

    Wie kann ich denn dem View mitteilen, dass er sich aktualisieren soll? Kann ich da vielleicht eine Message senden?!?

    Mit UpdateData() funktioniert das irgendwie net ... 😞

    Bem.: Anwendung läuft unter Windows CE.



  • Afaik darf den View nur der Thread direkt bearbeiten, der ihn auch angelegt hat - aus deinem Arbeitsthread könntest du jedoch die Daten an einem bekannten Punkt (z.B. interne Member der View-Klasse) ablegen und anschließend einen Event oder eine Message an den Hauptthread schicken, damit der sich um die Weiterverarbeitung kümmern kann.



  • CStoll schrieb:

    aus deinem Arbeitsthread könntest du jedoch die Daten an einem bekannten Punkt (z.B. interne Member der View-Klasse) ablegen und anschließend einen Event oder eine Message an den Hauptthread schicken, damit der sich um die Weiterverarbeitung kümmern kann.

    Ja, das könnte ich somachen ... und wie schicke ich den Event/Message?



  • Event: Du legst einen CEvent in deiner View-Klasse an - anschließend kann der Thread diesen Event setzen und das Hauptprogramm ihn irgendwo per WaitForSingleObject abfragen (z.B. in der OnIdle() oder während der Nachrichtenbehandlung)

    Message: Du brauchst eine eigene Message-ID und eine zugehörige Behandlungsroutine im View - der Thread schickt dann per PostMessage() die Nachricht ans Hauptfenster und dieses kümmert sich beim nächsten Durchlauf durch die Warteschlange darum, die Nachricht zu verarbeiten.



  • CStoll schrieb:

    Message: Du brauchst eine eigene Message-ID und eine zugehörige Behandlungsroutine im View - der Thread schickt dann per PostMessage() die Nachricht ans Hauptfenster und dieses kümmert sich beim nächsten Durchlauf durch die Warteschlange darum, die Nachricht zu verarbeiten.

    Oki .. danke, das werde ich dann so machen. Hatte die ganze Zeit gedacht, dass ich eine Std.-Message schicken muss.
    Aber eigene anlegen und verschicken kann ich zum Glück 😉



  • Mhh... ich habe jetzt doch noch ein Problem.

    Wie bekomme ich denn einen Handle auf den View? Auf HWND_BROADCAST reagiert da nix. Ich musste auch mit dem #define in der "Unterklasse" den Msg.Typ nochmal deklarieren, da er ja dort nicht bekannt ist. Stimmt das?
    Das ganze ist eine Doc-View-Architektur, falls das einen Unterschied zu einer Dialoganwendung macht.

    Was ich bislang gemacht habe: (Vielleicht ist das ja auch schon falsch)

    In der View Klasse:

    //hpp-File
    #define WM_MYMSG (WM_USER+1)
    
    class View : public CFormView {
    
    public:
       LONG OnMyMsg(WPARAM wParam, LPARAM lParam);
    }
    
    // cpp-file:
    BEGIN_MESSAGE_MAP(View, CFormView)
    	ON_MESSAGE(WM_MYMSG, OnMyMsg)
    END_MESSAGE_MAP()
    
    LONG View::OnMyMsg(WPARAM wParam, LPARAM lParam)
    {
       // tue was
       return 0;
    }
    

    In der Klasse in der Thread läuft:

    // cpp-File
    #define WM_MYMSG (WM_USER+1)
    
    DWORD WINAPI ThreadKlasse::MyThread(LPVOID lpParam) {
    
        ...
        PostMessage(HWND_BROADCAST, WM_MYMSG, NULL, NULL); 
        ...
    }
    


  • Du könntest dir die Adresse des View an deine Thread-Funktion übergeben - und es dann am Anfang der Arbeit nach seinem HWnd fragen.


Log in to reply