<?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[Threads bei Programmende Löschen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hatte die Tage mit Threads schon Probleme und da gabs hier ne Disskussion: <a href="http://www.c-plusplus.net/forum/viewtopic.php?t=90808" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic.php?t=90808</a></p>
<p>Nun habe ich meine Threads umgestellt, das FreeOnTerminate = false ist.</p>
<p>Meine Threads werden weiterhin so erzeugt:</p>
<pre><code class="language-cpp">TMyThread *thread = new TMyThread(true); 
MyThreadList-&gt;Add(thread);
</code></pre>
<p>Da ich die Threads nun ja selbst freigeben muss, habe ich mein OnForm Destroy entsprechend angepasst:</p>
<pre><code class="language-cpp">void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   for (int i = 0; i &lt; MyThreadList-&gt;Count; i++)
   {
      delete (TMyThread*)MyThreadList-&gt;Items[i];
   }

   delete MyThreadList;
}
</code></pre>
<p>Beim beenden der Anwednung, kommt nun wieder eine Zugriffverletzung. Es wird kein Thread vorzeitig beendet!!!</p>
<p>Nachdem Fehler findet sich der sich in Execute Funktion des Threads eine Markierung. Kann es sein, dass der Thread erst durchlaufen muss? Ich will den Thread aber sofort beenden.</p>
<p>Mache ich da noch was falsch?</p>
<p>Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/91143/threads-bei-programmende-löschen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 09:51:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/91143.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Nov 2004 12:28:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Fri, 05 Nov 2004 12:28:11 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hatte die Tage mit Threads schon Probleme und da gabs hier ne Disskussion: <a href="http://www.c-plusplus.net/forum/viewtopic.php?t=90808" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic.php?t=90808</a></p>
<p>Nun habe ich meine Threads umgestellt, das FreeOnTerminate = false ist.</p>
<p>Meine Threads werden weiterhin so erzeugt:</p>
<pre><code class="language-cpp">TMyThread *thread = new TMyThread(true); 
MyThreadList-&gt;Add(thread);
</code></pre>
<p>Da ich die Threads nun ja selbst freigeben muss, habe ich mein OnForm Destroy entsprechend angepasst:</p>
<pre><code class="language-cpp">void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   for (int i = 0; i &lt; MyThreadList-&gt;Count; i++)
   {
      delete (TMyThread*)MyThreadList-&gt;Items[i];
   }

   delete MyThreadList;
}
</code></pre>
<p>Beim beenden der Anwednung, kommt nun wieder eine Zugriffverletzung. Es wird kein Thread vorzeitig beendet!!!</p>
<p>Nachdem Fehler findet sich der sich in Execute Funktion des Threads eine Markierung. Kann es sein, dass der Thread erst durchlaufen muss? Ich will den Thread aber sofort beenden.</p>
<p>Mache ich da noch was falsch?</p>
<p>Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/645358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/645358</guid><dc:creator><![CDATA[Kevin Koel]]></dc:creator><pubDate>Fri, 05 Nov 2004 12:28:11 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Fri, 05 Nov 2004 12:47:17 GMT]]></title><description><![CDATA[<p>Ich würde die Threads mit Terminate() beenden.</p>
<pre><code class="language-cpp">MyThread-&gt;Terminate();
MyThread = NULL;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/645373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/645373</guid><dc:creator><![CDATA[thready]]></dc:creator><pubDate>Fri, 05 Nov 2004 12:47:17 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Fri, 05 Nov 2004 15:17:21 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>funtzt soweit, nur das = NULL; setzen geht nicht, das habe ich erstmal weggelassen. Aber wird so auch wirklich der ganze Speicher wieder freigegeben?</p>
<p>Immerhin wird der Thread ja nicht mittels delete gelöscht.</p>
<p>Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/645510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/645510</guid><dc:creator><![CDATA[Kevin Koel]]></dc:creator><pubDate>Fri, 05 Nov 2004 15:17:21 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Fri, 05 Nov 2004 15:22:04 GMT]]></title><description><![CDATA[<p>Kevin Koel schrieb:</p>
<blockquote>
<p>...Aber wird so auch wirklich der ganze Speicher wieder freigegeben? Immerhin wird der Thread ja nicht mittels delete gelöscht.<br />
Kevin</p>
</blockquote>
<p>IMHO, ja!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/645518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/645518</guid><dc:creator><![CDATA[thready]]></dc:creator><pubDate>Fri, 05 Nov 2004 15:22:04 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Fri, 05 Nov 2004 15:36:29 GMT]]></title><description><![CDATA[<p>wird er imho nicht aber man kann ihn nicht mehr starten(über Resume() ), probier aber mal folgendes nach dem Terminate() :</p>
<pre><code class="language-cpp">MyThread-&gt;WaitFor(); //Wartet auf Beendigung des Threads
delete MyThread;
</code></pre>
<p>Setzt natürlich voraus das der Thread beendet wird wenn man Terminate() aufruft.</p>
<p>z.B. Mittels einer while(!Terminated) schleife</p>
]]></description><link>https://www.c-plusplus.net/forum/post/645522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/645522</guid><dc:creator><![CDATA[Beliah]]></dc:creator><pubDate>Fri, 05 Nov 2004 15:36:29 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Fri, 05 Nov 2004 16:26:00 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe in mein FormDestroy nun dies hier stehen:</p>
<pre><code class="language-cpp">void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   for (int i = 0; i &lt; MyThreadList-&gt;Count; i++)
   {
      ((TMyThread*)MyThreadList-&gt;Items[i])-&gt;Terminate();
      ((TMyThread*)MyThreadList-&gt;Items[i])-&gt;WaitFor();
      delete ((TMyThread*)MyThreadList-&gt;Items[i]);
   }

   delete MyThreadList;
}
</code></pre>
<p>Hier ist das Problem, dass die Anwendung zwar beendet wird, weil sie nicht mehr zu sehen ist, aber anstelle des grünen Pfeils zum starten der Awendung im BCB wird immer noch der blaue Pfeil angezeigt. Anscheinend, werden die Threads nicht sofort beendet. Ich möchte diese aber sofort beenden und die Anwendung verlassen.</p>
<p>Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/645588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/645588</guid><dc:creator><![CDATA[Kevin Koel]]></dc:creator><pubDate>Fri, 05 Nov 2004 16:26:00 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Sat, 06 Nov 2004 10:23:48 GMT]]></title><description><![CDATA[<p>Was genau steht denn in der TThread::Execute()?<br />
Wie viele Threads startest Du?<br />
Mit welcher Priorität laufen die Threads?</p>
<p>Du kannst auch mal versuchen zuerst alle Threads zu 'suspenden' und dann gezielt einzelne weiter laufen zu lassen und zu terminieren:</p>
<p>Aus der Form::CloseQuery() in einem meiner Projekte:</p>
<pre><code class="language-cpp">bool DoClose = true;

if (MyThreads)
{
	try
	{
		TList* pList = MyThreads-&gt;LockList();
		if (pList-&gt;Count)
		{
			if (Application-&gt;MessageBoxA(&quot;Abbrechen?&quot;, &quot;Abbruchanforderung&quot;, MB_YESNO) == IDYES)
			{
				for (int i = 0; i &lt; pList-&gt;Count; i++)
				{
					TTestThread* pThread = (TTestThread*) pList-&gt;Items[i];
					if (!pThread-&gt;Suspended)
						pThread-&gt;Suspend();
				}
				for (int i = 0; i &lt; pList-&gt;Count; i++)
				{
					TTestThread* pThread = (TTestThread*) pList-&gt;Items[i];
					pThread-&gt;Priority = tpNormal;
					if (pThread-&gt;Suspended)
						pThread-&gt;Resume();
					pThread-&gt;Terminate();
					Application-&gt;ProcessMessages();
					pThread-&gt;WaitFor();
				}
				DoClose = true;
			}
			else
			{
				DoClose = false;
			}
		}
		else
		{
			DoClose = true;
		}
	}
	__finally
	{
		MyThreads-&gt;UnlockList();
	}
}

CanClose = DoClose;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/645946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/645946</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 06 Nov 2004 10:23:48 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Sun, 07 Nov 2004 12:22:16 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>mein Thread Execute sieht so aus:</p>
<pre><code class="language-cpp">void __fastcall TMyThread::Execute()
{
   AnsiString back;

   while(!Terminated)
   {
      back = GetValues(para);

      if (back == &quot;ok&quot;)
      {
         Synchronize(AddValue);
      }
      else
      {
         Synchronize(AddError);
      }

      // Bis zum nächsten Seitenwechsel abwarten
      Sleep(int(random(8)+2)*1000);
   }
}
</code></pre>
<p>Ich führe permanent Berechnungen durch und speicher die in Variablen meines Formes.</p>
<p>Deinen Code kann ich nicht ganz nachvollziehen, erst pausierst du alle Threads und in der nächsten Schleife hast du wieder:</p>
<p>if (pThread-&gt;Suspended)<br />
pThread-&gt;Resume();</p>
<p>Wieso nicht die Threads direkt nach dem pausieren beenden?</p>
<p>Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/646602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/646602</guid><dc:creator><![CDATA[Kevin Koel]]></dc:creator><pubDate>Sun, 07 Nov 2004 12:22:16 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Sun, 07 Nov 2004 13:37:46 GMT]]></title><description><![CDATA[<p>Weil die Threads, solange sie 'suspended' sind, nicht ausgeführt werden, also können Sie auch nicht 'terminated' werden...</p>
<p>Diese Vorgehensweise soll nur dafür sorgen, dass die Threads keine unnötige Rechenzeit mehr verbrauchen und der Thread, der gerade beendet werden soll, die maximal verfügbare Rechenzeit erhält.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/646665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/646665</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 07 Nov 2004 13:37:46 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Sun, 07 Nov 2004 20:54:08 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>egal was ich mache, ich bekomme immer irgendwelche zugriffsverletzungen. Also immer wenn ich WaitFor mache kommt immer eine. Ich verzweifle langsam echt. Kann es vielleicht auch an meinem Execute liegen?</p>
<p>Oder das irgendwie das Form vor den Threads beendet wird? Habe echt keine Ahnung mehr.</p>
<p>Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/646946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/646946</guid><dc:creator><![CDATA[Kevin Koel]]></dc:creator><pubDate>Sun, 07 Nov 2004 20:54:08 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Sun, 07 Nov 2004 21:41:38 GMT]]></title><description><![CDATA[<p>Wenn ich mich nicht irre, wird er Code</p>
<pre><code>// Bis zum nächsten Seitenwechsel abwarten 
     Sleep(int(random(8)+2)*1000);
</code></pre>
<p>zuunterst in Deiner TMyThread::Execute() gar nicht ausgeführt, wenn Du das Formular zu machst und so das Programm terminierst. Kann sein, dass ich mich täusche und das nur dann der Fall ist, wenn man den Thread selbst gar nie explizit beendet. Aber ich erinnere mich, dass ich mal einen Breakpoint dort hinsetzte und der nie angesprungen wurde obschon das Programm korrekt beendet wurde... nur so als Hinweis...</p>
<p>- Adrian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/646978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/646978</guid><dc:creator><![CDATA[ABader]]></dc:creator><pubDate>Sun, 07 Nov 2004 21:41:38 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Sun, 07 Nov 2004 22:04:08 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wie kann ich denn dann ein Sleep in der Execute Funktion reinmachen, also ein Sleep der geht? Vielleicht mit ein Syntesize?</p>
<p>Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/646996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/646996</guid><dc:creator><![CDATA[Kevin Koel]]></dc:creator><pubDate>Sun, 07 Nov 2004 22:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Tue, 09 Nov 2004 07:12:00 GMT]]></title><description><![CDATA[<p>Gib mir mal Deine E-Mail-Adresse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/647880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/647880</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 09 Nov 2004 07:12:00 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Tue, 09 Nov 2004 07:59:00 GMT]]></title><description><![CDATA[<p>Joe_M. schrieb:</p>
<blockquote>
<p>Gib mir mal Deine E-Mail-Adresse.</p>
</blockquote>
<p>warum schreibst du es nicht einfach hier, damit es auch andere nutzen können?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/647909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/647909</guid><dc:creator><![CDATA[warum?]]></dc:creator><pubDate>Tue, 09 Nov 2004 07:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to Threads bei Programmende Löschen on Tue, 09 Nov 2004 08:07:33 GMT]]></title><description><![CDATA[<p>Weil ich Dir ein kleines lauffähiges Projekt mailen wollte...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/647919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/647919</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 09 Nov 2004 08:07:33 GMT</pubDate></item></channel></rss>