<?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[while-Schleife: GUI wird nicht freigegeben]]></title><description><![CDATA[<p>Ich habe einen Start- und einen Stop-Button, damit ich über eine while-Schleife ständig Bilder von einer Kamera in Echtzeit erhalte. Problem ist nur: Wenn ich Start drücke verkriecht sich das Programm in eine Endlosschleife und die GUI wird nicht freigegeben. Weder bewegt sich das Ausgabebild noch kann ich den Stop-Button drücken, um die Abbruchbedingung der while-Schleife auszulösen. Bei Delphi gab es für sowas einen &quot;Application.ProcessMessages&quot;, gibts sowas auch für C++?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/146116/while-schleife-gui-wird-nicht-freigegeben</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Jul 2026 09:24:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/146116.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 May 2006 11:27:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Thu, 04 May 2006 11:27:34 GMT]]></title><description><![CDATA[<p>Ich habe einen Start- und einen Stop-Button, damit ich über eine while-Schleife ständig Bilder von einer Kamera in Echtzeit erhalte. Problem ist nur: Wenn ich Start drücke verkriecht sich das Programm in eine Endlosschleife und die GUI wird nicht freigegeben. Weder bewegt sich das Ausgabebild noch kann ich den Stop-Button drücken, um die Abbruchbedingung der while-Schleife auszulösen. Bei Delphi gab es für sowas einen &quot;Application.ProcessMessages&quot;, gibts sowas auch für C++?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1050811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1050811</guid><dc:creator><![CDATA[JPSelter]]></dc:creator><pubDate>Thu, 04 May 2006 11:27:34 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Thu, 04 May 2006 11:38:37 GMT]]></title><description><![CDATA[<p>Zeig mal ein wenig Code her, damit man das verfolgen kann.</p>
<p>Ich gehe aber stark davon aus, daß du durch eine Schleife in der OnStart()-Bearbeitung deine komplette Nachrichtenschleife blockiert hast. Weitere Windows-Nachrichten (z.B. andere Buttons oder WM_PAINT) werden erst verarbeitet, wenn die OnStart() fertig ist - und wenn diese Methode darauf wartet, daß der Stop-Button gesetzt wird, hast du einen erstklassischen Deadlock (bzw. eine Endlosschleife).</p>
<p>Als Lösung könntest du die eigentliche Bildverarbeitung in einen autonomen Thread auslagern, der von OnStart() angestoßen wird und von OnStop() eine Nachricht erhält, daß er sich beenden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1050820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1050820</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 04 May 2006 11:38:37 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Thu, 04 May 2006 11:43:18 GMT]]></title><description><![CDATA[<p>Du hast Recht, ich bin innerhalb der OnStart Routine, also der OnButtonClick. Also kann ich erst wieder Nachrichten empfangen, wenn ich da raus bin, was aber nicht geht, weil dadrin die while-Schleife ist. OK, dann muss ich mal lernen, wie man Threads programmiert, das ist Neuland für mich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1050826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1050826</guid><dc:creator><![CDATA[JPSelter]]></dc:creator><pubDate>Thu, 04 May 2006 11:43:18 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Thu, 04 May 2006 11:51:46 GMT]]></title><description><![CDATA[<p>Oder du machst nen Timer. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1050832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1050832</guid><dc:creator><![CDATA[estartu]]></dc:creator><pubDate>Thu, 04 May 2006 11:51:46 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Thu, 04 May 2006 12:03:57 GMT]]></title><description><![CDATA[<p>wenn's mfc ist: AfxGetApp()-&gt;PumpMessage();</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1050839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1050839</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Thu, 04 May 2006 12:03:57 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Fri, 05 May 2006 06:56:54 GMT]]></title><description><![CDATA[<p>net schrieb:</p>
<blockquote>
<p>wenn's mfc ist: AfxGetApp()-&gt;PumpMessage();</p>
</blockquote>
<p>Genau das muss es sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Ich hab nochmal nachgedacht und mir ist aufgefallen, dass ein Thread zuviel des Guten wäre, zumal ich ja nur wie bei Delphi Messages forcieren muss, dieses PumpMessages tut dies hoffentlich, muss ich gleich mal testen.</p>
<p>Wie baue ich so einen Timer? Zur Zeit benutze ich die Clock-Funktion gepaart mit einer wait-Routine, was ja eigentlich dasselbe macht oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1051207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1051207</guid><dc:creator><![CDATA[JPSelter]]></dc:creator><pubDate>Fri, 05 May 2006 06:56:54 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Fri, 05 May 2006 07:04:46 GMT]]></title><description><![CDATA[<p>Timer geht ganz einfach, schau dir diese Funktionen mal an:<br />
SetTimer<br />
WM_TIMER<br />
KillTimer</p>
<p>Oder guck da mal: <a href="http://www.se.fh-heilbronn.de/usefulstuff/VCPLUS6/inhalt.htm" rel="nofollow">http://www.se.fh-heilbronn.de/usefulstuff/VCPLUS6/inhalt.htm</a> Tag 4</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1051213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1051213</guid><dc:creator><![CDATA[estartu]]></dc:creator><pubDate>Fri, 05 May 2006 07:04:46 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Fri, 05 May 2006 07:39:06 GMT]]></title><description><![CDATA[<p>Du musst künstlich dafür sorgen, das die Nachrichten weitergeleitet und verarbeitet werden.</p>
<p>Müsste etwa so aussehen:</p>
<pre><code class="language-cpp">MSG msg;
while (PeekMessage(&amp;msg, NULL, 0,0, PM_NOREMOVE))
{
    AfxGetApp()-&gt;PumpMessage();
}
</code></pre>
<p>(ungetestet, einfach mal probieren <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/1051237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1051237</guid><dc:creator><![CDATA[Cpp_Junky]]></dc:creator><pubDate>Fri, 05 May 2006 07:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Fri, 05 May 2006 07:49:17 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9534">@JPSelter</a></p>
<p>Ich kann nur davon abraten den Anstz zu verwenden der hier mehrfach empfolhlen wurde, AfxGetApp()-&gt;PumpMessage(), zu verwenden.</p>
<p>Dein Programm wird dadurch reentrant! D.h. während der Ausführung steht Deine komplette GUI wieder zur Verfügung und man kann theoretisch alle möglichen Operationen durchführen. Du müsstest vorher alle entsprechenden GUI Elemente disablen.</p>
<p>Nehmen wir mal an Du hättest Button1 und Button2 in Deinem Diaoh. Button1 löst die lange Berechnung aus, und dort wird AfxGetApp()-&gt;PumpMessage() aufgerifen.<br />
Der User kann nun Button2 klicken, was evtl. auch wieder was auslöst. Oder er klickt nocohmal Button1 und die Berechnung wird zum zweiten mal gestartet.</p>
<p>Evtl. langt es ja, wenn Du mit UpdateWindow die UI mal refreshst!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1051249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1051249</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 05 May 2006 07:49:17 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Fri, 05 May 2006 07:54:57 GMT]]></title><description><![CDATA[<p>estartu schrieb:</p>
<blockquote>
<p>Oder du machst nen Timer. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Das wird wohl nix, da der Timer auch nur eine Nachricht sendet. Diese wird aber in der OnStart() auch nicht verarbeitet.</p>
<p>Ich empfehle ebenfalls eine Lösung mit Threads.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1051256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1051256</guid><dc:creator><![CDATA[Gill Bates]]></dc:creator><pubDate>Fri, 05 May 2006 07:54:57 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Fri, 05 May 2006 08:08:57 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/9534">@JPSelter</a></p>
<p>...<br />
Dein Programm wird dadurch reentrant! D.h. während der Ausführung steht Deine komplette GUI wieder zur Verfügung und man kann theoretisch alle möglichen Operationen durchführen. Du müsstest vorher alle entsprechenden GUI Elemente disablen....</p>
</blockquote>
<p>Naja, in der MSG Struktur steht ja der hwnd des Fensters an das die Nachricht geht sowie der Nachrichtentyp. Dadurch lassen sich diese gezielt rausfiltern.</p>
<blockquote>
<p>Evtl. langt es ja, wenn Du mit UpdateWindow die UI mal refreshst!</p>
</blockquote>
<p>Nö, auch dies löst eine Nachricht aus und zeigt erst wieder Wirkung wenn das Programm die while Schleife verlässt und seine Nachrichtenschleife wieder aufnimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1051262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1051262</guid><dc:creator><![CDATA[Cpp_Junky]]></dc:creator><pubDate>Fri, 05 May 2006 08:08:57 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Fri, 05 May 2006 08:15:26 GMT]]></title><description><![CDATA[<p>Gill Bates schrieb:</p>
<blockquote>
<p>estartu schrieb:</p>
<blockquote>
<p>Oder du machst nen Timer. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Das wird wohl nix, da der Timer auch nur eine Nachricht sendet. Diese wird aber in der OnStart() auch nicht verarbeitet.</p>
</blockquote>
<p>Das kommt ganz darauf an, was die OnTimer()-Methode macht <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>
<p>Im einfachsten Fall setzt die OnStart() lediglich den Timer und beendet sich dann wieder. Und in der OnTimer()-Verarbeitung fragst du erst ab, ob die Endebedingungen erfüllt wurden, wenn ja, verarbeitest du ein Bild, setzt den Timer neu und beendest die Methode.<br />
(auf die Weise wird die Methode immer zyklisch wieder aufgerufen, aber deine Anwendung hat zwischendurch Zeit, andere Nachrichten zu bearbeiten)</p>
<p>Bei der Alternativlösung mit dem Thread behältst due deine normale while()-Schleife bei - da diese aber in einem eigenen Thread läuft, stört sie die GUI-Verarbeitung des Programms nicht weiter (die OnStart() schupst lediglich den Thread an (eventuell nach etwas Vorarbeit), merkt sich sein Handle und kehrt zur Nachrichtenschleife zurück).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1051273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1051273</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 05 May 2006 08:15:26 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Fri, 05 May 2006 08:22:06 GMT]]></title><description><![CDATA[<p>Ich hätte fast den Weg von CStoll genommen:<br />
OnStart: SetTimer, sonst nix.<br />
OnEnde: KillTimer, sonst nix.<br />
OnTimer: Bild abholen und anzeigen</p>
<p>Aber nachdem ich über das von CStoll nachgedacht habe... wenn das Bild abholen lange dauert, sollte man es so abändern:<br />
OnTimer: KillTimer, Bild abholen und anzeigen, SetTimer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1051277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1051277</guid><dc:creator><![CDATA[estartu]]></dc:creator><pubDate>Fri, 05 May 2006 08:22:06 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Fri, 05 May 2006 08:55:39 GMT]]></title><description><![CDATA[<p>Cpp_Junky schrieb:</p>
<blockquote>
<p>Nö, auch dies löst eine Nachricht aus und zeigt erst wieder Wirkung wenn das Programm die while Schleife verlässt und seine Nachrichtenschleife wieder aufnimmt.</p>
</blockquote>
<p>Unsinn. Der Button wird geklickt. Die Mausnachricht wird an den Button aufgrund der des message pumps abgeholt und ausgeführt und die WM_COMMAND Nachricht wird sofort versendet und der Handler dann ein zweites mal aufgerufen!</p>
<p>Eigene Message Pumps sind nur in extrem wenigen Fällen sinnreich. In diesem in jedem Falle nicht! Just my 2 cents!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1051315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1051315</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 05 May 2006 08:55:39 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Fri, 05 May 2006 08:57:03 GMT]]></title><description><![CDATA[<p>Danke für die vielen Vorschläge. Ich probiere einfach mal alles nacheinander aus. Das Bildholen dauert übrigens nicht lange und zudem liefert die Kamera eh nur mit maximal 5fps. Zu dem PumpMessages: Ein disablen der GUI Komponenten ist selbstverständlich <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/1051317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1051317</guid><dc:creator><![CDATA[JPSelter]]></dc:creator><pubDate>Fri, 05 May 2006 08:57:03 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Mon, 29 May 2006 15:09:12 GMT]]></title><description><![CDATA[<p>EDIT: Hat sich erledigt <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/1067460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1067460</guid><dc:creator><![CDATA[JPSelter]]></dc:creator><pubDate>Mon, 29 May 2006 15:09:12 GMT</pubDate></item><item><title><![CDATA[Reply to while-Schleife: GUI wird nicht freigegeben on Tue, 30 May 2006 05:50:31 GMT]]></title><description><![CDATA[<p>Willst du kein Anfängerprogramm dann verwende Threads.<br />
Leite eine Klasse von CWinThreads ab.<br />
Wie du dann noch auf die GUI zugreifen kannst steht in der FAQ. (this an Threadklasse übergeben)<br />
Threads sind nur dann komplexer wenn du sie syncronisieren musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1067772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1067772</guid><dc:creator><![CDATA[Unix-Tom]]></dc:creator><pubDate>Tue, 30 May 2006 05:50:31 GMT</pubDate></item></channel></rss>