mit mehrern Thread auf einen Device Context zeichnen??



  • Ich möchte mehrere objekte (gleichzeitig) auf dem DC bewegen. Dabei soll je ein thread pro grafisches Objekt und desen bewegung erzeugt werden..

    muss ich un den DC pointer welche global für alle thread gelten soll via CCritical section syncronisieren?? grüße

    P.S.: Dieser Beitrag sollte eigentlich in das MFC forum..



  • Afaik darf nur der Thread in dein Fenster zeichnen, der es auch angelegt hast - also solltest du die Bewegungen der Teilobjekte an den Oberflächenthread weitergeben, der sie dann darstellen kann (ja, diese Zugriffe mußt du synchronisieren).

    BorisDieKlinge schrieb:

    P.S.: Dieser Beitrag sollte eigentlich in das MFC forum..

    Ist er doch 😃



  • ja das P.S. war irrelevant:)

    ja ich hab quaise 2 DC ein realen (paint funktion) und ein Temporären, welche in der paint funktion auf den realen kopiert wird (Bitblt). Auf den Temporären kann ich ja dann mit mehren thread zeichnen oder? seh ich das falsch?


  • Mod

    Nein! Auch das nicht.
    Nimm mal nur als Beispiel:

    Thread 1: Setzt Textfarbe Blau
    Thread 2: Setzt Textfarbe Rot
    Thread 1: Führt DrawText aus
    Thread 2: Führt DrawText aus

    Solch ein Kontextswitch ist möglich und würde Dir hier die Suppe versalzen.

    Warum willst Du das überhaupt?
    Sammele die Datei in einem Thread und lass diese von dort direkt anzeigen.

    Das Zeichnen wird nicht schneller, wenn Du es von mehreren Threads so ausführst!
    DCs sind eben nicht zustandlos. Es verbietet sich fast automatisch die Nutzung aus mehreren Threads von ein und dem selben DC!



  • Martin Richter schrieb:

    Nein! Auch das nicht.
    Nimm mal nur als Beispiel:

    Thread 1: Setzt Textfarbe Blau
    Thread 2: Setzt Textfarbe Rot
    Thread 1: Führt DrawText aus
    Thread 2: Führt DrawText aus

    Solch ein Kontextswitch ist möglich und würde Dir hier die Suppe versalzen.

    müsste aber eigentlich gehen, wenn man einen lock benutzt (mutex o.ä.) und bevor man den mutex freigibt ein 'GdiFlush()' aufruft...



  • nene die einzelnen thread positionieren jeweils ihr eingens Grafikobjekt bei jedem aufruf auf dem DC. Danach malt der hauptthread der paint funktion diese temp DC.

    Beispiel. man lässt 2 objekt unabhängig (jeweils ein trhead) rotieren.. dabei berechnet jeder thread die neie positon ...

    der hauptthread malt dann diese objekte abhänger der jeweiligen postionen auf den paint DC.

    jeder Thread hat dann quasie seinen eignen zeichen-Bereich auf dem DC..


  • Mod

    Und wie zeichnest Du bitte in den DC ohne Attribute des DCs zu verändern?
    Ich sehe nicht wie das Zeit sparen soll?

    @ten: Und warum sollteich dann wieder mehere DCs verwenden wenn ich dann bei alles wieder runtersynchronisiere auf einen Thread?
    Das macht doch keinen Sinn.

    Sobald man synchonisierung in Threads verwenden muss, muss man sich auch fragen, wann sich Threads blockieren.



  • naja es geht darum das die einzlene thread nicht nur für das zeichnen der objekte ist.

    jeder Thread soll stellt einen unabhängigen prozess einer maschine dar....diese sollen zusätlich visualisiert werden. beispiel Motorachsenrotation!

    MotorA dreht sich mit 500U/Min
    MororB dreht sich mit 1000U/Min

    diese rotation soll abhängig der U/min im gemeinsam DC dargstellt werden. und jeder motor hat einen eigene trhead..



  • Ja und, blubb?
    Deswegen musst du ja noch lange nicht in den Motörachsenthreads zeichnen, oder? Reicht ja wenn die das irgendwem mitteilen der das dann zeichnet. Oh Mann Mann Mann Mann...

    Davon abgesehen, wieso verwendest du dafür überhaupt irgendwelche Threads?
    Erklär mal... dann kann ich dir nämlich zurückerklären wieso du dafür eigentlich garkeine Threads brauchst 😃



  • ja ich weis.... bin am überlegen wei ich das machen könnte...

    wenn ich jetzt bspw. einee anwendung habe, in der 10 Stopuhren auf einem fenster sind. Jede Stopuhr hat einne Start und Stop Button, und eine Zeitanzeige... und alle Stopuhren sind auf einem gemeinsmaen DC eines Fenster dargestellt.

    naja und ich dachte mir wenn ich mir das ich für jede stopuhr einen eigen thread mache, welche die "uhrzeit" auf den gemeinsamen DC darstellt.

    Wie würdest ihr das gehen.. oder wie würded das ihr lösen ohne WM_TIMER oder so zu verwenden?



  • mach doch 10 child windows, dann hast du 10 DCs...
    und das problem mit multithreads in einem DC hat sich erledigt 🙂



  • ja aber es sollte alle auf einem DC funktionieren.... es sinst später keine stopuhren... war nur als Beispiel gedacht wieso ich thread verwenden möchte...



  • BorisDieKlinge schrieb:

    ja aber es sollte alle auf einem DC funktionieren....

    warum? es merkt keiner, dass es child-windows sind.



  • hmm kann man child-windows auf einem fenster so anordnen das keine übergänge zu sehen sind? das der DC später eine maschine abstrakt darstellt...die maschine behinhaltet unterscheidliche unabhänge prozesse (jeweils trhead dacht ich mir) welche in ihrem fortschritt/status auf dem DC dargestelt wernde soll..



  • das geht. man kann child windows ohne rand u.ä. machen. man kann in jedes childwnd separat malen/blitten und du kannst es beliebig im hauptfenster positionieren. vielleicht kennste noch 'custom controls'? die war'n früher mal sehr beliebt in vb und vc++ etc. (weiss ja nicht mehr wie das heute ist).
    es gibt übrigens auch open source libraries für sowas (mit allen möglichen grafikobjekten usw.)

    btw: guck dir mal das an: http://www.blinkenlights.de/download/bm_play.zip
    hat ein freund von mir gemacht, die fenster des hauses sind alles child windows)
    du musst dir von der seite die animationen runterladen: http://www.blinkenlights.de/movies.en.html
    damit du was siehst
    🙂



  • und wenn ich child windows überschneiden darstelle dürfte auch kein problem sein??


  • Mod

    BorisDieKlinge schrieb:

    ja ich weis.... bin am überlegen wei ich das machen könnte...

    wenn ich jetzt bspw. einee anwendung habe, in der 10 Stopuhren auf einem fenster sind. Jede Stopuhr hat einne Start und Stop Button, und eine Zeitanzeige... und alle Stopuhren sind auf einem gemeinsmaen DC eines Fenster dargestellt.

    naja und ich dachte mir wenn ich mir das ich für jede stopuhr einen eigen thread mache, welche die "uhrzeit" auf den gemeinsamen DC darstellt.

    Wie würdest ihr das gehen.. oder wie würded das ihr lösen ohne WM_TIMER oder so zu verwenden?

    Das ist einfach nicht gut. Es berücksichtigt nicht das Windows auf Befehl zeichnen will. Und eine "letzte"-Kopie vorzubereiten für einen solchen Fall ist auch Quark.

    10 Stopuhren heißt:
    1 Routine die zeichnet und bei Bedarf eben die 10 Stopuhren und Ihre Infos abfragen.
    Jede Stopuhr setzt einen Invalidate für den Bereich des Bildschirms ab, der neu gezeichnet werden muss.
    Die OnPaint Routine kann ermitteln welches rectangle zu zeichnen ist und welche Objekte betroffen sind. Es muss also nicht alles neu gezeichnet werden.

    Die wenigesten Entwickler machen sich die Mühe das Rect zu berücksichtigen, das mit OnPaint/BeginPaint geliefert wird, aber es macht das zeichnen erst effektiv.



  • @Martin: kannst du mal ei nbeispiel amchen mit dem invalidate füe einen bestimmten bereich?

    Ist es dennoch sinvoll ein trhead pro stopuihr zu machen... das sie unabhänign voneinader die zeit zählen?


Anmelden zum Antworten