Programm stürzt beim Befehl CDC* pDC = GetDC(); ab



  • Hallo und guten Morgen,

    ich hab jetzt soweit alles mit den RectTracker hinbekommen und es funktioniert auch super bis auf eine Sache. Ich habe ein Thread, der mein Zeichenbereich immer neu zeichnet und auch die RectTracker mit dem Befehl CRectTracker->Draw(CDC* pDC);

    Bei dem Befehl CRectTracker->Draw(CDC* pDC); muss Ich ja meinen Device Kontext auslesen mit dem Befehl CDC* pDC = GetDC(); und übergebe dann pDC in den Draw Befehl.

    Jetzt kommt es aber immer mal wieder vor, dass er mir bei GetDC() 0x00000000 als Wert zurückgibt und dann steigt das Programm aus mit einer Fehlermeldung in der RectTracker cpp. Direkt abfangen nachdem 0 zurückkommt und nochmal auslesen bringt nichts. Das komische ist auch, dass dann teilweise mein kompletter Bildschirm nach dem Fehler falsch gezeichnet wird ( Taskleiste unten grau, Teile der Startleiste sind oben am Bildschirm usw... )

    Ist Jemand so etwas schonmal passiert mit dem Befehl ?? Bin jetzt langsam echt am Ende. Hab schon try Schleifen und alles versucht.

    Vielen Dank schonmal



  • und wenn ich es dann mehrmals auslese nachdem der Fehler gekommen ist. Gibt er dann immer 0 zurück. Das ist wie wenn er irgendwie das Fenster verlieren würde oder so.


  • Mod

    Die MFC Fenster Objekte dürfen in keinem Fal über Threadgrenzen hinweg benützt werden!
    Die Fensteer werden in threadlokalen Maps verwaltet! Es wundert also nicht das Du hier kein Fenserhandle bekommst auf diese Art und Weise!

    Warum machst Du denn den Quatsch mit dem Thread. Für so ein bischen UI braucht man keinen zweiten Thread!



  • Ich hab 50 verschiedene CRectTracker Objekte die gezeichnet werden müssen und auch noch ein Webcam Stream. DArum hab ich alles sauber in ein Thread gemacht. Und ich bekomm ja das Handle nur nach einer Weile kann es passieren, dass er es mal nicht bekommt und dann steigt er halt aus. Was kann ich dagegen machen, wenn ich nicht alles in die WM_PAINT Message schreiben will


  • Mod

    pmb schrieb:

    Ich hab 50 verschiedene CRectTracker Objekte die gezeichnet werden müssen und auch noch ein Webcam Stream. DArum hab ich alles sauber in ein Thread gemacht. Und ich bekomm ja das Handle nur nach einer Weile kann es passieren, dass er es mal nicht bekommt und dann steigt er halt aus. Was kann ich dagegen machen, wenn ich nicht alles in die WM_PAINT Message schreiben will

    Das Verhalten ist in jedem Fall zu 100% undefiniert CWnd und CRectTracker sind cniht threadsicher Punkt! Was Du hier machst kann nicht gehen.

    Zudem: Es bringt Dir keinerlei Vorteil es in einem Thread zu machen. Oder der Vorteil ist so minimal, dass ich mir den Trouble nicht antun würde.



  • Ich hab jetzt mal CDC* pDC als Member definiert und les sie nur in WM_PAINT aus. DerThread greift dann nur auf die Member zu. So scheint es bis jetzt zu gehen. Danke für die ganzen Antworten, aber das währe jetzt mega viel Geschäft in WM_PAINT zu schreiben weils halt 50 Punkte sind. Daher muss es einfach so gehen 😮 . Aber fürs nächste mal merk ich es mir.

    Danke Martin


  • Mod

    pmb schrieb:

    , aber das währe jetzt mega viel Geschäft in WM_PAINT zu schreiben weils halt 50 Punkte sind. Daher muss es einfach so gehen 😮 .

    Ich knn Dir in keiner Weise folgen und ich finde den Weg immer noch falsch. Man verwendet Objekte die klar und zu 100% nicht threadsicher sind eben nicht in mehreren Threads!
    Wäre ich Dein Vorgesetzter würde ich Dir die Hammelbeine langziehen! 🤡

    Ich habe einen Editor für gerichtete Graphen gebaut um Arbeitsprozesse zu steuern. Dort werden bei sehr großen Projekten biszu 1000 Objekte angezeigt. Wenn ich auf "alles Markieren" Klicke werden 1000 Tracker Rects gezeichnet alles in WM_PAINT.
    Das ist überhaupt gar nichts. Weit aus problematischer und langsamer ist es die Objekte selbst mit Text zu zeichnen.



  • Aber jetzt ist es halt schon geschrieben 🙂 und sagen wir mal ich hab einfach keine lust das jetzt alles hinundherzukopieren 😃 .Wenn der Fehler nochmal kommt, dann muss ich es wohl ändern.... Aber du weisst ja : Never change a running system 👍 😉 .

    Aber Wie gesagt
    Danke nochmal


Anmelden zum Antworten