Ungültiger Zeiger



  • Hallo, ich hoffe, jemand kann mir weiterhelfen.

    Ich habe ein MDI-Projekt, bei dem ein Dialogfeld permanent zu sehen ist und mir von einem der Fenster den Status anzeigen soll, je nach dem was im jeweiligen Fenster gewählt ist. Schalte ich also zwischen den verschiedenen Fenstern um, soll sich die Anzeige entsprechend ändern. Das funktioniert mal soweit gut. Ein Thread kontrolliert nun regelmässig den Status und bekommt, je nach gwähltem Fenster, einen Pointer des aktiven Fensters zugewiesen, das habe ich mit OnActivateView gemacht.
    Das Problem ist nun, wenn ich ein Fenster schliesse, der Thread den Pointer nach dem Status abfragt, bevor er neu zugewiesen worden ist. Es kommt folgende Meldung: Unbehandelte Ausnahme bei 0x004fe4a1 in MyProgram.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x01aa04d0. Sollte diese Ausnahme nicht mit einem try-catch abgefangen werden können? (hat nicht geklappt) Oder kann ich den Pointer irgendwie auf Gültigkeit prüfen? Mit OnClose kann ich den Pointer auch nicht Null setzen, da der Thread seinen Zyklus noch nicht beendet hat.

    Hat jemand eine Idee??

    Vielen Dank!



  • CWnd- Zeiger sind nur im erzeugenden Thread gültig. Das HWND kann man über Threadgrenzen hinaus verwenden.



  • Sorry, hab mich falsch ausgedrückt, es handelt sich nicht um einen Pointer auf ein Fenster, sondern eine Datenstruktur mit meinen benötigten Informationen.



  • Wenn Du schon Threads verwendest, obwohl das eigentlich unnötig ist,dann mach es doch einfach so:

    ThreadProc()
    {
      HWND hWnd = GetFocus();
      CWnd* pWnd = CWnd::FromHandle( hWnd);
      if( pWnd && pWnd->IsKindOf( RUNTIME_CLASS(CFensterVonDemStatusangezeigtwerdensoll)))
        Update();
      else
        Clear();
    }
    


  • Hmmmmmm....das nenn ich Ursachenbekämpfung statt Symptombekämpfung, was ja eigentlich gut ist. Ich muss mal schauen, ob ich das irgendwie umsetzen kann(sehe es zwar noch nicht) Das Programm ist halt nicht auf meinem Mist gewachsen, und im Thread kommt noch einiges mehr, weswegen dieser wohl oder übel nötig ist.

    Wirft denn dieser Fehler keine Exception, die elegant abgefangen werden kann?


Anmelden zum Antworten