Announcement

Collapse
No announcement yet.

Leinwand erlaubt kein Zeichnen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Leinwand erlaubt kein Zeichnen

    Servus!

    Kann irgendjemand was mit dem Fehler "Leinwand erlaubt kein Zeichnen" anfangen. Der Fehler wird auf jeden Fall von einem BitBlt-Aufruf ausgelöst. Das komische ist aber, dass es auf einem Rechner geht, auf dem anderen nicht.

    Weiß jemand, woher das kommt bzw. was nun genau da das Zeichnen verhindert?

    Danke!

    Ciao

    Benni

  • #2
    Verschweigst du uns, dass du mit Threads arbeitest?<p>
    Gruß,<br>
    Marku

    Comment


    • #3
      Oops - Ja, das hab ich unterschlagen ;-

      Comment


      • #4
        ... und bei Zugriffen auf die MainForm arbeitest du nicht mit synchronize

        Comment


        • #5
          Ich hatte sowas ähnliches auch schon bei Reports, wenn Win9x einfach die Ressourcen ausgingen..
          Schöne Grüße, Mario

          Comment


          • #6
            Diese fehlermeldung kommt wenn man versucht in hDC = 0 zu zeichnen. Genauer gesagt, man versucht üner Canvas.Handle: hDC zu zeichenen, intern ist Canvas aber vom Type TControlCanvas und dieser versucht im Falle von .Handle == 0 ein Gerätecontext zum passenden Fenster zu holen, über FHandle := GetDC(WindowHandle); Nun, hier gibt GetDC() aber NULL zurück. Entweder weil IsWindow(WindowHandle) <> TRUE oder eben weil mehr als 5 geräteContexte aktiv sind, oder weil sonstwas im GDI passiert ist.<br>

            Wichtig ist nur eines, NUR der erste Fehler IsWindow(WindowHandle) <> TRUE kann als Normalfall eingestuft werden. Alle anderen Fehler sind begründet im Threaded Zugriff auf das GDI !! Genau an diesen Stellen traten bei mir im threaded Zugriff zwei Fehler auf:<br>

            1.) die DC's wurden nicht mehr korrekt verwaltet und freigegeben, d.h. nach 5 Versuchen ist die max. Anzahl von DC's durch's GDI verbraucht und es können keine weiteren DC's erzeugt werden<br>
            2.) eie Funktione konnte intern durchs GDI nicht korrekt bearbeitet werden, deshalb lieferte das GDI einfach NULL zurück.<br>

            Fazit: TControlCanvas ist in keinem Falle Threadsafe da ein solcher Canvas indirekt über .Control auf die VCL-Controls zugreift. Dieser Canvas kann also zur gleichen Zeit wie z.B. der Mainthread dem Control einen hDC zuordnen oder anders gesagt, zu einem Fensterhandle könnten mehrere hDC zu gleichen Zeit existieren (threaded) die durchs GDI parallel angesprochen werden. Oder aber EIN TControlCanvas alloziert zur gleichen zeit ZWEI hDC kann aber in der Eigenschaft FHandle nur EINEN hDC speichern und wieder freigeben. Damit würde ein hDC als Speicherleak zurück bleiben.<br>

            Fazit: das GDI ist nicht threadsafe, höchstens Thread-"resistent" aber nicht safe. Das Problem entsteht immer dann wenn das GDI einen Gerätecontext = hDC zu einen Fensterhandle = hWnd verwaltet, alloziert oder freigibt. Dies ist meine persönliche Erfahrung.

            Gruß hage

            Comment


            • #7
              Die Loesung muss also lauten: mit Synchronize im Hauptthread zeichnen. Anmerkung: Canvas = Leinwand. Da hat der Uebersetzer furchtbar zugeschlagen

              Comment


              • #8
                :

                Comment

                Working...
                X