<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Im Thread Paint ausführen]]></title><description><![CDATA[<p>hi</p>
<p>ich bin dabei eine Art Ping Pong zu schreiben. Nun habe ich einen Thread für meinen Ball geschrieben.</p>
<pre><code class="language-cpp">VOID Thread(PVOID pvoid)
    {

      HWND hwnd;
      HDC hdc;

         while(true)
         {           
          bx=bx+bdx;
          by=by+bdy; 

          if(by&gt;=585 || by&lt;=10)
          {
            bdy=bdy*-1;        
          }         

          if(bx&gt;=685 || bx&lt;=0)
          {
            bdx=bdx*-1;        
          }         

          //InvalidateRect(hwnd, NULL, TRUE);

          Sleep(10);
         }  
     }
</code></pre>
<p>mein Problem ist jetzt das ich nicht weiß, wie ich im Thread WM_PAINT die Nachricht zum neu zeichnen geben. Also ich will meinen Ball immer aktualisieren und dazu muss ich ja sagen Bildinhalt löschen und alles neu zeichnen.<br />
Das geht ja normalerweise über</p>
<p>InvalidateRect(hwnd, NULL, TRUE);</p>
<p>doch wie geht das aus dem Thread herraus, vielleicht mit SendMessage?</p>
<p>Danke an alle, die mir helfen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/185301/im-thread-paint-ausführen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 05 Jul 2026 14:54:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/185301.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 23 Jun 2007 19:56:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Im Thread Paint ausführen on Sat, 23 Jun 2007 19:56:11 GMT]]></title><description><![CDATA[<p>hi</p>
<p>ich bin dabei eine Art Ping Pong zu schreiben. Nun habe ich einen Thread für meinen Ball geschrieben.</p>
<pre><code class="language-cpp">VOID Thread(PVOID pvoid)
    {

      HWND hwnd;
      HDC hdc;

         while(true)
         {           
          bx=bx+bdx;
          by=by+bdy; 

          if(by&gt;=585 || by&lt;=10)
          {
            bdy=bdy*-1;        
          }         

          if(bx&gt;=685 || bx&lt;=0)
          {
            bdx=bdx*-1;        
          }         

          //InvalidateRect(hwnd, NULL, TRUE);

          Sleep(10);
         }  
     }
</code></pre>
<p>mein Problem ist jetzt das ich nicht weiß, wie ich im Thread WM_PAINT die Nachricht zum neu zeichnen geben. Also ich will meinen Ball immer aktualisieren und dazu muss ich ja sagen Bildinhalt löschen und alles neu zeichnen.<br />
Das geht ja normalerweise über</p>
<p>InvalidateRect(hwnd, NULL, TRUE);</p>
<p>doch wie geht das aus dem Thread herraus, vielleicht mit SendMessage?</p>
<p>Danke an alle, die mir helfen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312398</guid><dc:creator><![CDATA[helpme]]></dc:creator><pubDate>Sat, 23 Jun 2007 19:56:11 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Sat, 23 Jun 2007 20:07:55 GMT]]></title><description><![CDATA[<p>Klatsch hinters InvalidateRect() noch nen UpdateWindow()</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312407</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sat, 23 Jun 2007 20:07:55 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Sat, 23 Jun 2007 20:57:20 GMT]]></title><description><![CDATA[<p>danke erstmal</p>
<p>ich habe jetzt...</p>
<pre><code class="language-cpp">VOID Thread(PVOID pvoid)
    {

      HWND hwnd;
      HDC hdc;

         while(true)
         {           
          bx=bx+bdx;
          by=by+bdy; 

          if(by&gt;=585 || by&lt;=10)
          {
            bdy=bdy*-1;        
          }         

          if(bx&gt;=685 || bx&lt;=0)
          {
            bdx=bdx*-1;        
          }         

          InvalidateRect(hwnd, NULL, TRUE);
          UpdateWindow(hwnd);

          Sleep(10);
         }  
     }
</code></pre>
<p>aber er schickt immer noch keine Nachricht zum neuzeichnen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312444</guid><dc:creator><![CDATA[helpme]]></dc:creator><pubDate>Sat, 23 Jun 2007 20:57:20 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Sat, 23 Jun 2007 21:10:00 GMT]]></title><description><![CDATA[<p>Übergib mal InvalidateRect () und UpdateWindow () das Handle des Fensters in dem gezeichnet werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312453</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 23 Jun 2007 21:10:00 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Sun, 24 Jun 2007 00:49:26 GMT]]></title><description><![CDATA[<p>Einen eigenen Thread für den Ball zu verwenden ist IMHO ein ganz schlechter Ansatz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312540</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 24 Jun 2007 00:49:26 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Sun, 24 Jun 2007 09:23:10 GMT]]></title><description><![CDATA[<p>ich habe doch das handle meines fenstern in dem gezeichnet wird übergeben.</p>
<p>UpdateWindow(hwnd);</p>
<p>zum anderen, wieso ist das ein schlechter Ansatz, begründe das mal.</p>
<p>Für mich schien das ideal, da ich auch den Thread stoppen (Pause) kann und das so mit der Bedienung des Spiels nebenherläuft.</p>
<p>weiß noch jemand was zum eigentlichen Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312615</guid><dc:creator><![CDATA[helpme]]></dc:creator><pubDate>Sun, 24 Jun 2007 09:23:10 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Sun, 24 Jun 2007 10:49:11 GMT]]></title><description><![CDATA[<p>helpme schrieb:</p>
<blockquote>
<p>ich habe doch das handle meines fenstern in dem gezeichnet wird übergeben.</p>
</blockquote>
<p>Aber nicht in dem Quellcode den du hier geposted hast <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";D"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312653</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sun, 24 Jun 2007 10:49:11 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Mon, 25 Jun 2007 01:46:25 GMT]]></title><description><![CDATA[<blockquote>
<p>zum anderen, wieso ist das ein schlechter Ansatz, begründe das mal.</p>
</blockquote>
<p>Weil es nicht notwändig ist, und du dir (unnötigerweise) die Komplexität einhandelst die eben mit mehreren Threads daherkommt.</p>
<p>Dein Sleep(10) garantiert dir auch nicht dass du auf jedem Rechner bzw. nichtmal zu jeder Zeit auf einem einzigen Rechner gleich viele Durchläufe pro Sekunde bekommst. Wenn du eine gleichmässige Geschwindigkeit (&quot;N Pixel pro Sekunde&quot;) haben willst musst du also sowieso dein Programm so abändern dass es mit unterschiedlichen Zeitspannen zwischen 2 Updates klarkommt, und dann kannst du statt der while Schleife im Thread z.B. gleich WM_TIMER ohne Thread verwenden.</p>
<p>So wie du auf 'bdx' und 'bdy' zugreifst ist das schonmal nicht sicher, zumindest nicht wenn du aus dem &quot;Haupt Thread&quot; auch darauf zugreifst.</p>
<p>Und: das UpdateWindow wird wohl nicht funktionieren, da die Message in dem Thread verarbeitet werden muss der das Fenster angelegt hat. Da UpdateWindow allerdings die Nachricht _sendet_ wird sie im &quot;Ball Thread&quot; verarbeitet, bzw. eben gerade nicht verarbeitet, weil falscher Thread.</p>
<p>Anstelle von UpdateWindow kannst du &quot;PostMessage(hwnd, WM_PAINT, 0, 0)&quot; versuchen, aber das ist immer noch ein Hack.<br />
Die &quot;saubere&quot; Version wäre eine eigene Message zu verwenden mit der du dem &quot;Fenster Thread&quot; mitteilst dass es sich gefälligst neu zu zeichnen hat. In dem Handler für diese eigene Message kannst du dann InvalidateRect() und UpdateWindow() verwenden genau so wie du es aus dem &quot;falschen&quot; Thread heraus versuchst.</p>
<p>Und genau weil das alles so ein riesen Quargel und viel zu kompliziert ist: verwende dafür keinen eigenen Thread sondern mach brav allen im Hauptthread.</p>
<blockquote>
<p>Für mich schien das ideal, da ich auch den Thread stoppen (Pause) kann und das so mit der Bedienung des Spiels nebenherläuft.</p>
</blockquote>
<p>Ach, funktioniert es denn???<br />
BTW: du glaubst nur dass es ideal ist weil du noch nicht genug Erfahrung mit sowas hast, bzw. dich mit Threads bzw. Threads unter Windows nicht wirklich auskennst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1313057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313057</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 25 Jun 2007 01:46:25 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Mon, 25 Jun 2007 06:10:59 GMT]]></title><description><![CDATA[<p>Anmerkung: Die beiden Aufrufe InvalidateRect und UpdateWindow lassen sich auch durch RedrawWindow einfach zusammenfassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1313099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313099</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 25 Jun 2007 06:10:59 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Tue, 26 Jun 2007 15:12:34 GMT]]></title><description><![CDATA[<p>so danke erstmal...</p>
<p>leider bin ich noch nicht viel weiter gekommen, weil das PostMessage() und das RedrawWindow() irgendwie nicht funktioniert (wird wahrscheinlich mein Fehler sein).</p>
<p>daher würde ich mich freuen, wenn mir jemand hilft, da mein ball immernochnicht akutalisiert wird.</p>
<p>ach ja wenn ich die deklaration von HWND hwnd ganz oben mache, dann wird mein ball schön aktualisiert, aber leider mit ihm auch der ganze desktop und das nervt ein bisschen.</p>
<p>also es wäre schön wenn mir noch jemand helfen könnte, mein fenster aus dem Thread heraus neu zu zeichnen (wenn es mit thread nicht geht, würde eine Lösung ohne auch gehen, hätte aber lieber die mit Thread)</p>
<p>so hier folgt der komplette code, ach ja den code für die bilder habe ich ein bisschen zusammenkopiert, weil der erst nicht richtig wollte und die rc datei brauch ich ja nicht extra posten, steht ja nicht viel drin.</p>
<p>danke</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;process.h&gt;
//#include &quot;PongPing0.7b.rc&quot;

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = &quot;Pong Ping V0.7&quot;;
static int                   bx=100,by=100,bdx=3, bdy=5;
//HWND   hwnd;   

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&amp;wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           &quot;Pong Ping V0.7&quot;,       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           700,                 /* The programs width */
           600,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&amp;messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&amp;messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&amp;messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}

    VOID Thread(PVOID pvoid)
    {

      //HWND hwnd;
      HDC hdc;

         while(true)
         {           
          bx=bx+bdx;
          by=by+bdy; 

          if(by&gt;=585 || by&lt;=10)
          {
            bdy=bdy*-1;        
          }         

          if(bx&gt;=685 || bx&lt;=0)
          {
            bdx=bdx*-1;        
          }         

          //InvalidateRect(hwnd, NULL, TRUE);
          //UpdateWindow(hwnd);
          //PostMessage(hwnd, WM_PAINT, 0, 0);
          //RedrawWindow(hwnd,NULL,NULL,NULL);

          Sleep(10);
         }  
     }

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HBITMAP               hBitmapKicker, hBitmapBall;
           BITMAP                bitmapkicker,bitmapball;
           static int            cxClient, cyClient,cxkickerSource,cykickerSource,cxballSource,cyballSource;
           HDC                   hdc, hdcKicker, hdcBall, hdcWindow;
           HINSTANCE             hInstance;
    static int                   kx=250,ky=500;
           PAINTSTRUCT            ps;    

    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
          hInstance = ((LPCREATESTRUCT) lParam)-&gt;hInstance;

          hBitmapKicker = LoadBitmap (hInstance, TEXT (&quot;KickerNormal&quot;)) ;
          hBitmapBall = LoadBitmap (hInstance, TEXT (&quot;Ballgelb&quot;)) ;

          GetObject (hBitmapKicker, sizeof (BITMAP), &amp;bitmapkicker) ;
          GetObject (hBitmapBall, sizeof (BITMAP), &amp;bitmapball) ;

          cxkickerSource = bitmapkicker.bmWidth ;
          cykickerSource = bitmapkicker.bmHeight ;

          cxballSource = bitmapball.bmWidth ;
          cyballSource = bitmapball.bmHeight ;

          _beginthread(Thread,0,NULL);

          return 0 ;

        case WM_SIZE:
          cxClient = LOWORD (lParam) ;
          cyClient = HIWORD (lParam) ;
          return 0 ;

        case WM_PAINT:
          hdc = BeginPaint (hwnd, &amp;ps) ;
          hdcKicker = CreateCompatibleDC (hdc) ;
          hdcBall = CreateCompatibleDC (hdc) ;

          SelectObject (hdcKicker, hBitmapKicker) ; //kicker =150x29
          BitBlt (hdc, kx,ky,cxkickerSource, cykickerSource, hdcKicker, 0, 0, SRCCOPY) ;

          SelectObject (hdcBall, hBitmapBall) ;      //ball =13x13        
          BitBlt (hdc, bx,by,cxballSource, cyballSource, hdcBall, 0, 0, SRCCOPY) ;

          DeleteDC (hdcKicker) ;
          DeleteDC (hdcBall) ;
          EndPaint (hwnd, &amp;ps) ;
          return 0 ;

        case WM_KEYDOWN:
        {
             switch (wParam)
             {
             case VK_LEFT:
                  if(kx&gt;0)
                  {
                  kx=kx-12;
                  }
                  break;

            case VK_RIGHT:
                 if(kx&lt;540)
                  {
                  kx=kx+12;
                  }
                 break;

         default:
            return 0;
         }
         InvalidateRgn(hwnd, NULL, TRUE);
         return 0;
      }

        case WM_DESTROY:
          DeleteObject (hBitmapKicker) ;
          DeleteObject (hBitmapBall) ;
          PostQuitMessage (0) ;
          return 0 ;

        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
</code></pre>
<p>danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314097</guid><dc:creator><![CDATA[helpme]]></dc:creator><pubDate>Tue, 26 Jun 2007 15:12:34 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Tue, 26 Jun 2007 17:23:09 GMT]]></title><description><![CDATA[<p>vergiss bitte einfach dass es sowas wie threads gibt. du machst so grundlegende dinge falsch, beschäftige dich erstmal damit ordentlich programmieren zu lernen. DANN sieh dir threads an wenns denn unbedingt sein muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314201</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 26 Jun 2007 17:23:09 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Tue, 26 Jun 2007 18:51:53 GMT]]></title><description><![CDATA[<p>1. du hast recht das ich mich mit threads noch nicht beschäftigt habe (ausser ein bisschen in Java)</p>
<p>Aber so wie ich das sehe ist mein problem auch nicht unbedingt der thread, ich habe vorhin auch schon ein bisschen anders rumprobiert (ohne Thread) und ich habe einfach ein problem, weil ich nicht weiß, wie ich zB aus WM_TIMER WM_PAINT aufrufe<br />
und soweit ich weiß brauche ich ja PostMessage() oder SendMessage() und die Funktion will wieder den handle meines Fensters, da würde ich sagen das es hwnd ist aber das funktioniert wieder nicht...</p>
<p>Genauso weiß ich auch nicht wie ich den handle ausserhalb der WndProc Funktion und der Winapi Funktion bekomme, bei HWND hwnd; bekomme ich den handle des gesamten desktops, aber ich will ja nur den meines programms</p>
<p>also ich habe quasi ein Problem und suche eine Lösung bzw. Hilfe, ich habe auch schon 2 Bücher gewälzt und mir die finger warm gegoogelt und das ohne ERFOLG</p>
<p>aber sry wenn ich versucht habe in einem forum hilfe zu finden, ich habe einfach gedacht, dasd ich einen kleinen fehler habe, ein hilfbereiter kommt, eben eine funktion einsetzt die ich übersehen hatte und dann alles läuft...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314267</guid><dc:creator><![CDATA[helpme]]></dc:creator><pubDate>Tue, 26 Jun 2007 18:51:53 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Tue, 26 Jun 2007 19:25:49 GMT]]></title><description><![CDATA[<p>Du kannst z.B. bei _beginthread() das gültige hWnd mit übergeben und bei deiner Thread-Funktion aus pvoid wieder rausfischen.</p>
<p>Bisher deklarierst du da zwar ein hwnd, aber initialisiert es nirgends <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";D"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314303</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Tue, 26 Jun 2007 19:25:49 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Tue, 26 Jun 2007 21:24:02 GMT]]></title><description><![CDATA[<p>klar ich kann es ja übergeben, gar nicht dran gedacht</p>
<p>tausend dank, es läuft jetzt genau so wie ich es wollte...</p>
<p>aber echt genau so einen denkanstoss habe ich gesucht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>danke nochmal geeky...</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a> so einen denkanstoss hättest du mir doch auch geben können, dann wäre es viel einfacher gewesen</p>
<p>danke auch an die anderen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314379</guid><dc:creator><![CDATA[helpme]]></dc:creator><pubDate>Tue, 26 Jun 2007 21:24:02 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Tue, 26 Jun 2007 23:46:05 GMT]]></title><description><![CDATA[<p>Ehrlich gesagt hab' ich den Window Handle Patzer übersehen, und bin dann auf dumme Ideen gekommen.<br />
Es geht natürlich in einem anderen Thread Funktionen wie InvalidateRect etc. aufzurufen, es ist nur trotzdem meistens keine gute Idee.</p>
<p>Dein Programm hat z.B. einen &quot;Schönheitsfehler&quot; (milde gesagt), nämlich beendest du den &quot;Ball Thread&quot; niemals. Da du aus dem &quot;Ball Thread&quot; aber auf dein Fenster zugreifst ... solltest du ihn beenden bevor du das Fenster schliesst. Würdest du diesen &quot;Schönheitsfehler&quot; beheben wollen sähe die &quot;naive&quot; Variante wahrsheinlich etwa so aus:</p>
<pre><code class="language-cpp">HANDLE g_endBallThreadEvent = 0;
HANDLE g_ballThread = 0;

//...

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
    // ...
    g_endBallThreadEvent = CreateEvent(0, true, 0, 0);

    // ...
    // message loop hier
    // ...

    // cleanup:
    CloseHandle(g_endBallThreadEvent);
    CloseHandle(g_ballThread);

    // ...
}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    // ...
          //_beginthread(Thread,0,NULL);
          g_ballThread = (HANDLE) _beginthreadex(...);
    // ...

        case WM_DESTROY:
          // zuerst thread beenden, dann erst fenster schliessen:
          SetEvent(g_endBallThreadEvent);
          WaitForSingleObject(g_ballThread, INFINITE);
          // ...
}

unsigned Thread(PVOID pvoid)
{
    // ...
    while (WaitForSingleObject(g_endBallThreadEvent, 0) != WAIT_OBJECT_0)
    {           
        // ...
        InvalidateRect(hwnd, ...);
    }
}
</code></pre>
<p>Sieht noch halbwegs einfach aus. Was man aber auf den ersten Blick nicht unbedingt sieht: wenn der &quot;Ball Thread&quot; gerade dabei ist InvalidateRect aufzurufen, während der Hauptthread in &quot;WaitForSingleObject(g_ballThread, INFINITE);&quot; wartet ... wird das Progamm &quot;feststecken&quot;, und du hast einen Deadlock gebaut.</p>
<p>Warum? InvalidateRect &quot;sendet&quot; die Message an das Fenster. Da das Fenster zu diesem Zeitpunkt noch existiert versucht das Betriebssystem eben die Message zu &quot;senden&quot;, und &quot;senden&quot; bedeutet dass darauf gewartet wird dass die Message vom Hauptthread (dem das Fenster gehört) verarbeitet wurde. Der Hauptthread wartet allerdings gerade in &quot;WaitForSingleObject&quot;, und in &quot;WaitForSingleObject&quot; verarbeitet er eben keine Messages, auch nicht welche die &quot;gesendet&quot; werden. Ergo wartet der &quot;Ball Thread&quot; darauf dass der Hauptthread seine Message verarbeitet, und der Hauptthread darauf dass sich der &quot;Ball Thread&quot; beendet. Der &quot;Hauptthread&quot; verarbeitet allerdings keine Messages mehr bevor der &quot;Ball Thread&quot; sich nicht beendet hat, und der &quot;Ball Thread&quot; beendet sich nicht bevor der &quot;Hauptthread&quot; nicht seine Message verarbeitet hat. Ein klassischer Deadlock.</p>
<p>Natürlich gibt es Möglichkeiten das zu fixen, aber dadurch wird alles bloss noch viel komplizierter.</p>
<p>Glaubst du mir jetzt dass Threads die Hölle sind (zumindest wenn man korrekte Programme schreiben will, die u.a. auch immer so funktionieren wie sie sollten)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314425</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 26 Jun 2007 23:46:05 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Wed, 27 Jun 2007 06:06:17 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>:<br />
InvalidateRect versendet keine Nachricht und kann auch von eionem fremden Thread ohne Gefahr aufgerufen werden! Anders UpdateWindow/RedrawWindow!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314464</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 27 Jun 2007 06:06:17 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Fri, 29 Jun 2007 03:22:24 GMT]]></title><description><![CDATA[<p>Ok, in dem Fall würde InvalidateRect noch gehen aber der Aufruf von UpdateWindow (der im Source Code des OP ja auch enthalten ist) würde den Deadlock komplett machen.</p>
<p>Worauf ich eigentlich hinaus wollte: mehrere Threads + Fenster = schwierig. Gewisse Dinge wie PostMessage kann man eigentlich immer gefahrlos machen, bei anderen Funktionen wird's schnell kompliziert.</p>
<p>p.S.: sorry für den faktischen Fehler <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314608</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 29 Jun 2007 03:22:24 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Fri, 29 Jun 2007 08:59:14 GMT]]></title><description><![CDATA[<p>ok, kein problem</p>
<p>danke für den code ich werd ihn mir nachher mal in ruhe anschauen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>PS: ich bin momentan dabei sound und punkte einzubauen und die Optik des Spiels zu verbessern, wahrscheinlich treffe ich bald wieder auf probleme, dann meld ich mich nochmal... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314744</guid><dc:creator><![CDATA[helpme]]></dc:creator><pubDate>Fri, 29 Jun 2007 08:59:14 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Fri, 29 Jun 2007 09:59:56 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>: Leider geht das aus den API Funktionen oft nicht hervor, dass Windows Nachrichten durch sie erzeugt werden. Dadurch kann man sich hier schon leicht vertun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314795</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 29 Jun 2007 09:59:56 GMT</pubDate></item><item><title><![CDATA[Reply to Im Thread Paint ausführen on Fri, 29 Jun 2007 21:10:55 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>: Leider geht das aus den API Funktionen oft nicht hervor, dass Windows Nachrichten durch sie erzeugt werden. Dadurch kann man sich hier schon leicht vertun.</p>
</blockquote>
<p>Genau deswegen hab' ich ja vermutet dass InvalidateRect eine Message senden würde - weil so viele andere Fenster-Manipulations-Funktionen es machen ohne dass es explizit irgendwo stehen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1315325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1315325</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 29 Jun 2007 21:10:55 GMT</pubDate></item></channel></rss>