<?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[FOR-Schleife mit Button abbrechen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte ein for-Schleife mit einem Button abbrechen, nur funktioniert das leider nicht...</p>
<p>Dass passiert bei Klick auf den Button:</p>
<pre><code class="language-cpp">void MyWriter::OnStop() 
{
	StopDataIO = true;
}
</code></pre>
<p>So sieht die For-Schleife aus:</p>
<pre><code class="language-cpp">for (i = 1; i &lt;= BufferAnzahl; i++)
		{
			DoEvents();
			// DataIO wird abgebrochen, wenn der Stop-Button gedrückt wurde
			// oder wenn 10 Fehler gefunden wurden und das Häkchen dafür gesetzt ist, dann abzubrechen
			if (StopDataIO == true || (StopAfterErrors &amp;&amp; FoundErrors &gt;= 10))
			{
				// StatusBar auf 100% setzen
				m_ProgressBar.SetPos(BufferAnzahl);
				// Schleife abbrechen
				break;
			}		
			Start();
			m_ProgressBar.SetPos(i);
		}
</code></pre>
<p>Mit diesem DoEvents möchte ich eigentlich alle offenen Messages abarbeiten:</p>
<pre><code class="language-cpp">void MyWriter::DoEvents()   // Evtl. Anstehende Events ausführen
{
    MSG msg;                    // Message Variable

    while (PeekMessage(&amp;msg,NULL,0,0,PM_NOREMOVE)) {    // Solange Messages vorhanden

        if (!AfxGetThread()-&gt;PumpMessage()) return;     
    }
}
</code></pre>
<p>So. Leider passiert bei Klick auf den Stopp-Button garnichts, die Schleife wird nicht unterbrochen. Er kriegt das wohl garnicht mit, das man auf den Stopp-Button klickt. Nach Abarbeitung der Schleife wird die Variable dann auch hübsch auf true gesetzt, nur dann ist es zu spät...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/184082/for-schleife-mit-button-abbrechen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 07:14:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/184082.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Jun 2007 09:36:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to FOR-Schleife mit Button abbrechen? on Tue, 12 Jun 2007 09:36:25 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte ein for-Schleife mit einem Button abbrechen, nur funktioniert das leider nicht...</p>
<p>Dass passiert bei Klick auf den Button:</p>
<pre><code class="language-cpp">void MyWriter::OnStop() 
{
	StopDataIO = true;
}
</code></pre>
<p>So sieht die For-Schleife aus:</p>
<pre><code class="language-cpp">for (i = 1; i &lt;= BufferAnzahl; i++)
		{
			DoEvents();
			// DataIO wird abgebrochen, wenn der Stop-Button gedrückt wurde
			// oder wenn 10 Fehler gefunden wurden und das Häkchen dafür gesetzt ist, dann abzubrechen
			if (StopDataIO == true || (StopAfterErrors &amp;&amp; FoundErrors &gt;= 10))
			{
				// StatusBar auf 100% setzen
				m_ProgressBar.SetPos(BufferAnzahl);
				// Schleife abbrechen
				break;
			}		
			Start();
			m_ProgressBar.SetPos(i);
		}
</code></pre>
<p>Mit diesem DoEvents möchte ich eigentlich alle offenen Messages abarbeiten:</p>
<pre><code class="language-cpp">void MyWriter::DoEvents()   // Evtl. Anstehende Events ausführen
{
    MSG msg;                    // Message Variable

    while (PeekMessage(&amp;msg,NULL,0,0,PM_NOREMOVE)) {    // Solange Messages vorhanden

        if (!AfxGetThread()-&gt;PumpMessage()) return;     
    }
}
</code></pre>
<p>So. Leider passiert bei Klick auf den Stopp-Button garnichts, die Schleife wird nicht unterbrochen. Er kriegt das wohl garnicht mit, das man auf den Stopp-Button klickt. Nach Abarbeitung der Schleife wird die Variable dann auch hübsch auf true gesetzt, nur dann ist es zu spät...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303780</guid><dc:creator><![CDATA[Querdenker]]></dc:creator><pubDate>Tue, 12 Jun 2007 09:36:25 GMT</pubDate></item><item><title><![CDATA[Reply to FOR-Schleife mit Button abbrechen? on Tue, 12 Jun 2007 12:21:43 GMT]]></title><description><![CDATA[<p>Während der Bearbeitung einer Nachricht liegt die Nachrichtenschleife normalerweise auf Eis. Das bedeutet auch, daß das Programm nicht auf Nutzer-Eingaben reagiert. Die eleganteste Lösung wäre es da vermutlich, Threads zu verwenden (oder auch Timer).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303925</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 12 Jun 2007 12:21:43 GMT</pubDate></item><item><title><![CDATA[Reply to FOR-Schleife mit Button abbrechen? on Tue, 12 Jun 2007 14:24:27 GMT]]></title><description><![CDATA[<p>Ich versuche gerade, das alles in einen Thread zu packen - nur leider muss ich bei der Abarbeitung verschiedene MFC Elemente wie Buttons oder ProgressBars aktualisieren oder verstecken oder deaktivieren... Und dabei stürzt das Programm dann immer ab...</p>
<p>Ich kopiere am besten mal ne Menge Quelltext <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>
<pre><code class="language-cpp">void MyWriter::OnStart() 
{
	// Startbutton verstecken, Stopbutton zeigen
	m_StartButton-&gt;ShowWindow(false);
	m_StopButton-&gt;ShowWindow(true);	

	UpdateData(FALSE);

	// Event RunEvent zeigt an, ob DataIO läuft
	DataIORunEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	if (DataIORunEvent != NULL)
	{		
		UpdateData(false);
		DataIOMutex = CreateMutex( NULL, TRUE, NULL );				// Mutex für den DataIO Thread

		// Thread für DataIO starten, this übergibt die instanz von MyWriter, die _beginthread aufruft
		// Wichtig, weil Thread auch Memeber-Variablen der Instanz verändern soll
		// dafür wird in eine nicht-Member Funktion ThreadTransferDataIO() gesprungen, die einen zeiger auf die Insatanz erstellt
		// Über diesen Zeiger werden dann die Member-Variablen und Funktionen aufgerufen

		_beginthread(ThreadTransferDataIO, 0, this);
		do {
			WaitForSingleObject( DataIOMutex, INFINITE );
			ReleaseMutex( DataIOMutex );
		} while ( WaitForSingleObject( DataIORunEvent, 75L ) == WAIT_TIMEOUT );

		UpdateData(FALSE);
	}

	else
	{
		m_TextUpdate += &quot;FEHLER: Konnte kein Terminal-Event erstellen! \r\n&quot;;
		UpdateData(FALSE);

	}

	// Start Button wieder anzeigen, Stop-Button verstecken
	m_StartButton-&gt;ShowWindow(true);
	m_StopButton-&gt;ShowWindow(false);

	UpdateData(FALSE);
}

// -------------------------- DATA-IO -------------------------- //

void __cdecl ThreadTransferDataIO(void *_this)
{
	MyWriter* ThisWriter = (MyWriter*) _this;
	ThisWriter-&gt;SwitchModus();
	ThisWriter = NULL;
}

void MyWriter::SwitchModus(void)
{		
	// Ermittlung der aktuellen Systemzeit zur Restzeitmessung
	int StartZeit = clock(); 
	int RestZeit = 0;

// HIER STÜRZT ER AB 
	m_ClearLog.EnableWindow(true);			// ClearLog Button aktivieren
	int i = 0;
	int z = 0;	// Zähler für die Statusleiste für Modus 3

	// Countdown in ms übergeben
	LARGE_INTEGER endTime = { Countdown*1000 };

	switch (Modus)
	{

	case 0:

		// BufferSize ist fest.
		// DataIO wird beendet, wenn die Anzahl der Pakete, die gesendet werden sollen, abgearbeitet ist.

		// Restzeit-Textausgabe wird auf invisible gesetzt
		m_RestzeitControl.ShowWindow(false);

		// ProgressBar wird auf visible gesetzt
// HIER STÜRZT ER AB 
		this-&gt;m_ProgressBar.ShowWindow(true);	

		// Progressbar konfigurieren
		// SetRange32 erwartet 2 Integer, die die untere bzw obere Grenze der Progressbar darstellen
// HIER STÜRZT ER AB 
	m_ProgressBar.SetRange32(1,BufferAnzahl);

		m_TextUpdate += &quot;-------------------------------------------------------------------------------------------------- \r\n&quot;;
		m_TextUpdate += &quot;BufferSize: &quot; + IntToCString(BufferSize) + &quot; Bytes, Anzahl der Durchläufe: &quot; + IntToCString(BufferAnzahl) + &quot;.\r\n&quot;;
		m_TextUpdate += &quot;-------------------------------------------------------------------------------------------------- \r\n&quot;;

		DoEvents();

		for (i = 1; i &lt;= BufferAnzahl; i++)
		{
			m_TextUpdate += &quot;\r\nDurchlauf &quot; + IntToCString(i) + &quot;...&quot;;

			// DataIO wird abgebrochen, wenn der Stop-Button gedrückt wurde
			// oder wenn 10 Fehler gefunden wurden und das Häkchen dafür gesetzt ist, dann abzubrechen
			if (StopDataIO == true || (StopAfterErrors &amp;&amp; FoundErrors &gt;= 10))
			{
				// StatusBar auf 100% setzen
				m_ProgressBar.SetPos(BufferAnzahl);
				// Schleife abbrechen
				break;
			}		
			// DataIO starten
			DataIO();

			DoEvents();

//			m_ProgressBar.SetPos(i);
		}

		break;			

// ......
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1304113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1304113</guid><dc:creator><![CDATA[Querdenker]]></dc:creator><pubDate>Tue, 12 Jun 2007 14:24:27 GMT</pubDate></item><item><title><![CDATA[Reply to FOR-Schleife mit Button abbrechen? on Thu, 14 Jun 2007 06:11:03 GMT]]></title><description><![CDATA[<p>Ein fremder Thread darf ja auch nicht auf die Dialog-Elemente zugreifen. Das heißt, du müsstest die darzustellenden Daten erstmal intern speichern und dann den Hauptthread per SendMessage (o.ä.) darüber benachrichtigen, daß er etwas darstellen soll.</p>
<p>PS: Vielleicht ist die Arbeit mit Timern auch einfacher für dich - OnStart() macht alle Vorbereitungsarbeiten und setzt einen Timer mit recht kurzem Intervall, in der zugehörigen OnTimer()-Methode führst du jeweils einen Schleifendurchlauf durch (und wenn die Abbruchbedingung zutrifft, killst du den Timer).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1305321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1305321</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 14 Jun 2007 06:11:03 GMT</pubDate></item><item><title><![CDATA[Reply to FOR-Schleife mit Button abbrechen? on Thu, 14 Jun 2007 06:24:22 GMT]]></title><description><![CDATA[<p>Was er sagt ist richtig und so wird es auch gemacht aber mann kann es auch einfacher machen quick and dirty ....<br />
Du machst Dir einfach einen globalen Pointer Deiner Anwendung und in der OnInit() setzt Du diesen auf this. In Deinem Thread kannst Du diesen dann Ansprechen und natürlich eben so Deine Controls oder Du definierst Dir eine Struktur in der der this Zeiger enthalten ist und benutzt diese dann als Aufrufparameter in Deinem Thread ....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1305337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1305337</guid><dc:creator><![CDATA[LEO_THE_BRAIN]]></dc:creator><pubDate>Thu, 14 Jun 2007 06:24:22 GMT</pubDate></item><item><title><![CDATA[Reply to FOR-Schleife mit Button abbrechen? on Thu, 14 Jun 2007 08:31:27 GMT]]></title><description><![CDATA[<p>LEO_THE_BRAIN schrieb:</p>
<blockquote>
<p>Was er sagt ist richtig und so wird es auch gemacht aber mann kann es auch einfacher machen quick and dirty ....<br />
Du machst Dir einfach einen globalen Pointer Deiner Anwendung und in der OnInit() setzt Du diesen auf this. In Deinem Thread kannst Du diesen dann Ansprechen und natürlich eben so Deine Controls oder Du definierst Dir eine Struktur in der der this Zeiger enthalten ist und benutzt diese dann als Aufrufparameter in Deinem Thread ....</p>
</blockquote>
<p>Böse, ganz ganz böse <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1305421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1305421</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Thu, 14 Jun 2007 08:31:27 GMT</pubDate></item><item><title><![CDATA[Reply to FOR-Schleife mit Button abbrechen? on Thu, 14 Jun 2007 10:54:05 GMT]]></title><description><![CDATA[<p>mach in deiner for-schleife als zweit Bedinungn eine abrruch bedingung und in der dialog klasse eine menber variable</p>
<pre><code class="language-cpp">m_Abort =false;

for(int i=0; i&lt; XXX &amp;&amp; !dlg.Abort(); i++){

}
//////////////////////////////////////////////////////////////////
// Abort: Abbruch funktion Abbruchbedingung
//////////////////////////////////////////////////////////////////
BOOL CDlgXXXX::Abort() {

    MSG msg;
    while (::PeekMessage(&amp;msg, NULL, 
        NULL, NULL, PM_NOREMOVE)) {
        AfxGetThread()-&gt;PumpMessage();
    }
    return m_bAbort;
}
</code></pre>
<p>bei mir gehts so auch ohne thread</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1305557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1305557</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 14 Jun 2007 10:54:05 GMT</pubDate></item><item><title><![CDATA[Reply to FOR-Schleife mit Button abbrechen? on Mon, 18 Jun 2007 02:54:48 GMT]]></title><description><![CDATA[<p>was ist eigentlich daran dirty das mit einem pointer zu machen? hat man dann irgendwelche sicherheits lecks, oder speicher zugriffsfehler?</p>
<p>in einem anderen forum wird einem, wenn man sowas wie schleife abbrechen oder fortschrittsanzeige fragt, einen fast schon copy&amp;paste tauglich ein pointer vorgekaut. mit dem kann man mit geringesten aufwand seine anwendung multithreading fähig machen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308110</guid><dc:creator><![CDATA[kleinern00b]]></dc:creator><pubDate>Mon, 18 Jun 2007 02:54:48 GMT</pubDate></item><item><title><![CDATA[Reply to FOR-Schleife mit Button abbrechen? on Mon, 18 Jun 2007 06:26:41 GMT]]></title><description><![CDATA[<p>Wenn du mit mehreren Threads auf das selbe Objekt zugreifen willst, mußt du die Zugriffe synchronisieren (sonst hast du womöglich ein Problem, wenn beide zeitgleich zugreifen und das Zielobjekt in gerade in einem undefinierten Zustand ist).</p>
<p>PS: Und bei WinAPI-Objekten (d.h. der Dialog und die darauf enthaltenen Items) kommt noch dazu, daß nur der Eigentümer-Thread darauf zugreifen <strong>darf</strong>, sonst ist Ärger vorprogrammiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1308144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1308144</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 18 Jun 2007 06:26:41 GMT</pubDate></item></channel></rss>