<?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[Endlosschleife mit Ende... (Großes Problem)]]></title><description><![CDATA[<p>Hallo!<br />
Ich habe ein großes Problem!<br />
Ich würde gerne ein paar Zeilen Code über den Menüeintrag Start ausführen!<br />
Dieser Code soll in einer Endlosschleife so lange ausgeführt werden, bis der Menüeintrag Stop gewählt wird!<br />
Zeitgleich soll in dem Hauptfenster (es gibt nur eins) Text immer wieder aktualisiert werden.</p>
<pre><code class="language-cpp">int WINAPI WinMain(HINSTANCE hInstance,        // Handle der Instanz
                   HINSTANCE hPrevInstance,
                   LPSTR     lpCmdLine,        // Kommandozeile
                   int       nCmdShow)         // Art der Anzeige
{
    MSG msg;                          // Zum Speichern einer Meldung

    hInst = hInstance;                // An globale Variable zuweisen

    if(!InitApplication())            // Fenster registrieren 
      return (FALSE);              

    if(!InitInstance(nCmdShow))       // Das Hauptfenster erzeugen
       return (FALSE);

    // Meldungen auslesen und weiterleiten, solange keine 
    // WM_QUIT Meldung kommt.
    while(GetMessage(&amp;msg,NULL,0,0))
    {
       TranslateMessage(&amp;msg);        // Übersetzt virtual key codes.
       DispatchMessage(&amp;msg);         // Meldung an das Fenster weitergeben.
    }
    return (msg.wParam);    // Den Wert von PostQuitMessage zurückgeben.
}

/////////////////////////////////////////////////////////////////////////
//  Funktion: InitApplication()
//
//  Zweck:    Initialisert die Daten des Fensters und registriert diese
//            Fensterklasse
//            Diese Funktion füllt eine Datenstruktur vom Typ WNDCLASSE
//            und ruft RegisterClass() auf.
//
BOOL InitApplication()
{
    WNDCLASSEX  wc; 

    // Die Struktur mit Werten füllen, die das Hauptfenster beschreibt.
    wc.cbSize         = sizeof(WNDCLASSEX);                  // Anzahl Bytes dieser Struktur.
    wc.style          = CS_HREDRAW | CS_VREDRAW;             // Fensterstile
    wc.lpfnWndProc    = (WNDPROC)WndProc;                    // Fensterprozedur
    wc.cbClsExtra     = 0;
    wc.cbWndExtra     = 0;
    wc.hInstance      = hInst;                               // Handle dieser Instanz
    wc.hIcon          = LoadIcon( NULL, IDI_HAND);			 // Standard-Icon
    wc.hCursor        = LoadCursor( NULL, IDC_ARROW);        // Standard-Cursor Pfeil
    wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH); // Hintergrund der Client Area
    wc.lpszMenuName   = MAKEINTRESOURCE(IDR_MENU);                                // Menue-Name (hier keins)
    wc.lpszClassName  = szAppName;                           // Name dieser Fensterklasse
    wc.hIconSm        = LoadIcon( NULL, IDI_HAND);			 // Standard-Icon (klein)

    // Die Fensterklasse registrieren und &quot;erfolgreich&quot; oder &quot;fehler&quot; zurückgeben.
    return RegisterClassEx(&amp;wc);    
}

/////////////////////////////////////////////////////////////////////////
//   Funktion: InitInstance(int)
//
//   Zweck:    Das Hauptfenster erzeugen und anzeigen.
//
BOOL InitInstance(int nCmdShow)
{
   HWND hWnd;

   hWnd = CreateWindowEx( 

						WS_EX_TOPMOST,
						szAppName,           // Name der Fensterklasse
                        szTitle,             // Titel des Fensters
                        WS_OVERLAPPEDWINDOW, // Fensterstil
                                             // Lage des Fensters:
                        0,					 // x-Koordinate
                        0,                   // y-Koordinate
                        200,				 // Fensterbreite
                        300,                 // Fensterhoehe
                        NULL,                // Handle: Elternfenster
                        NULL,                // Handle: Menue
                        hInst,               // Handle des Programms
                        NULL);               // Zeiger auf zusätzliche Daten
                                             // für WM_CREATE
   if (!hWnd) 
      return (FALSE);

   ShowWindow(hWnd, nCmdShow);				 // Fenster anzeigen.
   UpdateWindow(hWnd);						 // Eine WM_PAINT-Meldung senden.

   return (TRUE);
}
</code></pre>
<p>Soweit ist ja alles ok! In der WinMain werden die Messages in der while-Schleife abgearbeitet. (So habe ich das zumindest verstanden...)</p>
<p>Hier werden nun die Meldungen verarbeitet. Unter Anderem existiert noch ein Menü:</p>
<pre><code class="language-cpp">///////////////////////////////////////////////////////////////////////////
//  Funktion:  WndProc(HWND, unsigned, WORD, LONG)
//
//  Zweck:     Meldungen verarbeiten.
//
//  Meldungen: WM_PAINT   - Fensterinhalt zeichnen
//             WM_DESTROY - WM_QUIT Meldung in die Warteschlange einfügen
//             WM_LBUTTONDOWN - Auf Linke Maustaste reagieren
//             . . .
//
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   PAINTSTRUCT ps;
   HDC  hdc;
   RECT rect;

   switch (message)
   {
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
			case ID_FILE_START:
                           HIER SOLL DIE ENDLOSSCHLEIFE GESTARTET WERDEN
			break;

			case ID_FILE_STOP:
			HIER SOLL DIE ENDLOSSCHLEIFE BEENDET WERDEN
			break;

			case ID_CONFIG_PIXELCHECK:
					break;

			case ID_CONFIG_STATISTIC:

				break;

			case ID_ABOUT_INFO:
				DialogBox(hInst, MAKEINTRESOURCE(IDD_INFO),hWnd, (DLGPROC)DlgProcInfo);
				break;

			case ID_FILE_EXIT:
				DestroyWindow(hWnd);
		}

     case WM_PAINT:

			hdc = BeginPaint( hWnd, &amp;ps);
 			GetClientRect(hWnd, &amp;rect);
			DrawText(hdc, statisticTab[i].text, -1, &amp;rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);			
			EndPaint( hWnd, &amp;ps);

         break;

      case WM_DESTROY:
         PostQuitMessage(0);
         break;

      default:
         return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}
</code></pre>
<p>So, wenn ich nun an den oben genannten Stellen den Code in der Endlosschleife starte, habe ich ja das Problem, dass ich aus der Endlosschleife keine Messages mehr heraus bekomme geschweige diese abegearbeitet werden! Somit ist ein Beenden nicht möglich! Was noch viel wichtiger ist... Im Hauptfenster wird der Text nicht mehr aktualisiert. Kann somit nicht mehr die Schleifendurchläufe zählen und im Hauptfenster ausgeben!</p>
<p>Ich befürchte, dass ich hier ein ganz banales Problem habe. Ehrlich gesagt sind es meine ersten Versuche mit C++ und der WinAPI... Bin sonst &quot;nur&quot; C und die Konsole gewöhnt. Anscheinend habe ich beim OOP so einige Denkfehler!</p>
<p>Wäre für Hilfe sehr dankbar!</p>
<p>mfg,</p>
<p>gammla</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/195333/endlosschleife-mit-ende-großes-problem</link><generator>RSS for Node</generator><lastBuildDate>Tue, 30 Jun 2026 00:59:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/195333.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Oct 2007 16:54:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Endlosschleife mit Ende... (Großes Problem) on Tue, 16 Oct 2007 16:54:09 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich habe ein großes Problem!<br />
Ich würde gerne ein paar Zeilen Code über den Menüeintrag Start ausführen!<br />
Dieser Code soll in einer Endlosschleife so lange ausgeführt werden, bis der Menüeintrag Stop gewählt wird!<br />
Zeitgleich soll in dem Hauptfenster (es gibt nur eins) Text immer wieder aktualisiert werden.</p>
<pre><code class="language-cpp">int WINAPI WinMain(HINSTANCE hInstance,        // Handle der Instanz
                   HINSTANCE hPrevInstance,
                   LPSTR     lpCmdLine,        // Kommandozeile
                   int       nCmdShow)         // Art der Anzeige
{
    MSG msg;                          // Zum Speichern einer Meldung

    hInst = hInstance;                // An globale Variable zuweisen

    if(!InitApplication())            // Fenster registrieren 
      return (FALSE);              

    if(!InitInstance(nCmdShow))       // Das Hauptfenster erzeugen
       return (FALSE);

    // Meldungen auslesen und weiterleiten, solange keine 
    // WM_QUIT Meldung kommt.
    while(GetMessage(&amp;msg,NULL,0,0))
    {
       TranslateMessage(&amp;msg);        // Übersetzt virtual key codes.
       DispatchMessage(&amp;msg);         // Meldung an das Fenster weitergeben.
    }
    return (msg.wParam);    // Den Wert von PostQuitMessage zurückgeben.
}

/////////////////////////////////////////////////////////////////////////
//  Funktion: InitApplication()
//
//  Zweck:    Initialisert die Daten des Fensters und registriert diese
//            Fensterklasse
//            Diese Funktion füllt eine Datenstruktur vom Typ WNDCLASSE
//            und ruft RegisterClass() auf.
//
BOOL InitApplication()
{
    WNDCLASSEX  wc; 

    // Die Struktur mit Werten füllen, die das Hauptfenster beschreibt.
    wc.cbSize         = sizeof(WNDCLASSEX);                  // Anzahl Bytes dieser Struktur.
    wc.style          = CS_HREDRAW | CS_VREDRAW;             // Fensterstile
    wc.lpfnWndProc    = (WNDPROC)WndProc;                    // Fensterprozedur
    wc.cbClsExtra     = 0;
    wc.cbWndExtra     = 0;
    wc.hInstance      = hInst;                               // Handle dieser Instanz
    wc.hIcon          = LoadIcon( NULL, IDI_HAND);			 // Standard-Icon
    wc.hCursor        = LoadCursor( NULL, IDC_ARROW);        // Standard-Cursor Pfeil
    wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH); // Hintergrund der Client Area
    wc.lpszMenuName   = MAKEINTRESOURCE(IDR_MENU);                                // Menue-Name (hier keins)
    wc.lpszClassName  = szAppName;                           // Name dieser Fensterklasse
    wc.hIconSm        = LoadIcon( NULL, IDI_HAND);			 // Standard-Icon (klein)

    // Die Fensterklasse registrieren und &quot;erfolgreich&quot; oder &quot;fehler&quot; zurückgeben.
    return RegisterClassEx(&amp;wc);    
}

/////////////////////////////////////////////////////////////////////////
//   Funktion: InitInstance(int)
//
//   Zweck:    Das Hauptfenster erzeugen und anzeigen.
//
BOOL InitInstance(int nCmdShow)
{
   HWND hWnd;

   hWnd = CreateWindowEx( 

						WS_EX_TOPMOST,
						szAppName,           // Name der Fensterklasse
                        szTitle,             // Titel des Fensters
                        WS_OVERLAPPEDWINDOW, // Fensterstil
                                             // Lage des Fensters:
                        0,					 // x-Koordinate
                        0,                   // y-Koordinate
                        200,				 // Fensterbreite
                        300,                 // Fensterhoehe
                        NULL,                // Handle: Elternfenster
                        NULL,                // Handle: Menue
                        hInst,               // Handle des Programms
                        NULL);               // Zeiger auf zusätzliche Daten
                                             // für WM_CREATE
   if (!hWnd) 
      return (FALSE);

   ShowWindow(hWnd, nCmdShow);				 // Fenster anzeigen.
   UpdateWindow(hWnd);						 // Eine WM_PAINT-Meldung senden.

   return (TRUE);
}
</code></pre>
<p>Soweit ist ja alles ok! In der WinMain werden die Messages in der while-Schleife abgearbeitet. (So habe ich das zumindest verstanden...)</p>
<p>Hier werden nun die Meldungen verarbeitet. Unter Anderem existiert noch ein Menü:</p>
<pre><code class="language-cpp">///////////////////////////////////////////////////////////////////////////
//  Funktion:  WndProc(HWND, unsigned, WORD, LONG)
//
//  Zweck:     Meldungen verarbeiten.
//
//  Meldungen: WM_PAINT   - Fensterinhalt zeichnen
//             WM_DESTROY - WM_QUIT Meldung in die Warteschlange einfügen
//             WM_LBUTTONDOWN - Auf Linke Maustaste reagieren
//             . . .
//
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   PAINTSTRUCT ps;
   HDC  hdc;
   RECT rect;

   switch (message)
   {
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
			case ID_FILE_START:
                           HIER SOLL DIE ENDLOSSCHLEIFE GESTARTET WERDEN
			break;

			case ID_FILE_STOP:
			HIER SOLL DIE ENDLOSSCHLEIFE BEENDET WERDEN
			break;

			case ID_CONFIG_PIXELCHECK:
					break;

			case ID_CONFIG_STATISTIC:

				break;

			case ID_ABOUT_INFO:
				DialogBox(hInst, MAKEINTRESOURCE(IDD_INFO),hWnd, (DLGPROC)DlgProcInfo);
				break;

			case ID_FILE_EXIT:
				DestroyWindow(hWnd);
		}

     case WM_PAINT:

			hdc = BeginPaint( hWnd, &amp;ps);
 			GetClientRect(hWnd, &amp;rect);
			DrawText(hdc, statisticTab[i].text, -1, &amp;rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);			
			EndPaint( hWnd, &amp;ps);

         break;

      case WM_DESTROY:
         PostQuitMessage(0);
         break;

      default:
         return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}
</code></pre>
<p>So, wenn ich nun an den oben genannten Stellen den Code in der Endlosschleife starte, habe ich ja das Problem, dass ich aus der Endlosschleife keine Messages mehr heraus bekomme geschweige diese abegearbeitet werden! Somit ist ein Beenden nicht möglich! Was noch viel wichtiger ist... Im Hauptfenster wird der Text nicht mehr aktualisiert. Kann somit nicht mehr die Schleifendurchläufe zählen und im Hauptfenster ausgeben!</p>
<p>Ich befürchte, dass ich hier ein ganz banales Problem habe. Ehrlich gesagt sind es meine ersten Versuche mit C++ und der WinAPI... Bin sonst &quot;nur&quot; C und die Konsole gewöhnt. Anscheinend habe ich beim OOP so einige Denkfehler!</p>
<p>Wäre für Hilfe sehr dankbar!</p>
<p>mfg,</p>
<p>gammla</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386567</guid><dc:creator><![CDATA[gammla]]></dc:creator><pubDate>Tue, 16 Oct 2007 16:54:09 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife mit Ende... (Großes Problem) on Tue, 16 Oct 2007 17:44:39 GMT]]></title><description><![CDATA[<p>ganz oben in der Datei unterhalb der includ verzeichnisse setzt u ne variable</p>
<pre><code>BOOL m_bWhile = FALSE;
</code></pre>
<p>dann</p>
<pre><code>case ID_FILE_START:
{
   m_bWhile = TRUE;
   do
     {
      //mach was
     }while(m_bWhile);
}
break;

case ID_FILE_STOP:
{
   m_bWhile = FALSE;
}break;
</code></pre>
<p>habs jetzt nicht getestet aber so sollte es funzen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386598</guid><dc:creator><![CDATA[*rT*f*Ct]]></dc:creator><pubDate>Tue, 16 Oct 2007 17:44:39 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife mit Ende... (Großes Problem) on Tue, 16 Oct 2007 17:44:54 GMT]]></title><description><![CDATA[<p>Was du suchst ist Multithreading. Google dich schlau.</p>
<p><a href="http://msdn2.microsoft.com/en-us/library/ms684254.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms684254.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386599</guid><dc:creator><![CDATA[tenchou]]></dc:creator><pubDate>Tue, 16 Oct 2007 17:44:54 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife mit Ende... (Großes Problem) on Tue, 16 Oct 2007 17:58:06 GMT]]></title><description><![CDATA[<p>@@rT!f@Ct<br />
Auf diese Weise habe ich es schon versucht. Das Problem ist, dass während der Schleifenabarbeitung keine Messages von der WinMain verarbeitet werden. Zumindest nicht zuverlässig! Meine Client Area ist in dieser Situation nicht Aktuell! Nehmen wir an, wir zählen eine Variable i mit jedem Schleifendurchlauf hoch und wollen den Inhalt der Variablen in der Client-Area anzeigen. Das Problem in dieser Situation ist, dass die WinMain die Messages nicht abarbeitet und somit nicht die Client-Area aktualisiert... Korrigiert mich, wenn ich da falsch liege... Hat bei mir so nicht wirklich funktioniert.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16559">@tenchou</a><br />
Das ist natürlich ein harter Brocken für einen Anfänger... Da sage ich nur: &quot;Ran ans Werk!&quot;</p>
<p>Falls euch noch Tips einfallen, bitte posten! Multithreading scheint wirklich hart zu sein....</p>
<p>mfg,</p>
<p>Gammla</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386606</guid><dc:creator><![CDATA[gammla]]></dc:creator><pubDate>Tue, 16 Oct 2007 17:58:06 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife mit Ende... (Großes Problem) on Tue, 16 Oct 2007 18:02:30 GMT]]></title><description><![CDATA[<p>Guck Dir mal die &quot;<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-193975.html" rel="nofollow">ProcessMessage-Funktion</a>&quot; an. Dann geht es sicherlich auch ohne Threads.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386609</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 16 Oct 2007 18:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife mit Ende... (Großes Problem) on Tue, 16 Oct 2007 18:15:00 GMT]]></title><description><![CDATA[<p>mach es in einem thread</p>
<p>wieder ganz oben deklaration</p>
<pre><code>BOOL m_bWhile = FALSE;
static	UINT thrFunc(LPVOID pParam);
void Schleife(HWND);
</code></pre>
<p>dann erstellst du die funktion</p>
<pre><code>UINT thrFunc (LPVOID pParam)
{
   Schleife((HWND)pParam );

   return 0;
}

void Schleife (HWND hWnd)
{
   m_bWhile = TRUE;
   do
     {
      //mach was
     }while(m_bWhile);
}

....

case ID_FILE_START:
{
    AfxBeginThread(thrFunc,hWnd);//Starte den Thread
}
break;

case ID_FILE_STOP:
{
   m_bWhile = FALSE;
}break;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1386616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386616</guid><dc:creator><![CDATA[*rT*f*Ct]]></dc:creator><pubDate>Tue, 16 Oct 2007 18:15:00 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife mit Ende... (Großes Problem) on Tue, 16 Oct 2007 18:11:42 GMT]]></title><description><![CDATA[<p>Danke!<br />
Die ProcessMessages Funktion reicht vollkommen für mich aus und erfüllt genau das, was ich brauche!</p>
<p>Nochmal danke an alle!</p>
<p>Werde mich natürlich in naher Zukunft auch um das Thema Multithreading kümmern!</p>
<p>Wobei ich den Code von @rT!f@Ct auch noch mal probieren werde!!!</p>
<p>mfg,</p>
<p>gammla</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386619</guid><dc:creator><![CDATA[gammla]]></dc:creator><pubDate>Tue, 16 Oct 2007 18:11:42 GMT</pubDate></item><item><title><![CDATA[Reply to Endlosschleife mit Ende... (Großes Problem) on Tue, 16 Oct 2007 18:54:15 GMT]]></title><description><![CDATA[<p>Also ich hätte einen Timer (WM_TIMER) vorgeschlagen, ist meistens das einfachste.<br />
Threads würde ich solange nicht verwenden wie es nicht nötig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386661</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 16 Oct 2007 18:54:15 GMT</pubDate></item></channel></rss>