<?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[Probleme mit TThread - bei erneutem Start wird Execute nur einmal ausgeführt]]></title><description><![CDATA[<p>Hi</p>
<p>Ich habe eine normale Form, und ein TThread-Objekt.<br />
Klicke ich in der Form auf einen Button, wird das TThread-Objekt per new mit CreateSuspend=false initialisiert.</p>
<p>m_Rod4Handler ist ein TThread-Objekt.</p>
<pre><code>try
     {
	  m_Rod4Handler=new Rod4Handler(false);
     }
     catch(Exception*  e)
     {
	MessageBox(this-&gt;ClientHandle,e-&gt;Message.c_str(),&quot;Fehler&quot;,MB_OK);
	this-&gt;Close();
     }
     Timer1-&gt;Enabled=true;
</code></pre>
<p>In der Execute-Methode wird zuerst eine externe Dll geladen, einige initialisierungen gemacht, und dann wird in eine while schleife übergegangen:</p>
<pre><code>void __fastcall Rod4Handler::Execute()
{
	  //erstmal initialisieren
	  //dll dynamisch laden

	  if(m_CanInit)
	  {
	   //zeugs für rauschunterdrückung initialisieren
	   m_Bilder=new TMessung[m_AnzBilderRauschunterdrueckung];
	   for (int counter=0; counter&lt;m_AnzBilderRauschunterdrueckung; counter++)
	   {
		m_Bilder[counter].sPunkte=NULL;
	   }

	   //rod4 initialisierem
	   InitRod4();
	   LoadNullScan();
	   m_CanInit=false;
	  }
	  m_aktStatus=&quot;Threadrunning&quot;;

	  while(!this-&gt;Terminated)
	  {
	   //hauptschleife, die immerwieder durchlaufen wird
	   m_aktStatus=&quot;Hauptschleife&quot;;
	   if(m_aktBildStatus==STATUS_MAKENEWBILD)
	   {
		//ein rauschfreies bild, aus den gesammelten erstellen
		m_aktStatus=&quot;Neues bild wird erstellt.&quot;;
		CreateRauschfreiesBild();
		m_aktBildStatus=STATUS_NOTHING;
	   }
	  }

	 // ReleaseRod4();
	  m_aktStatus=&quot;Erfolgreich Released&quot;;
}
</code></pre>
<p>Zum beenden per Knopfdruck wird wieder ein Button in der Form gedrückt:</p>
<pre><code>//Timer1-&gt;Enabled=false;
 m_Rod4Handler-&gt;StopThread();
 Label1-&gt;Caption=&quot;Alles freigegeben&quot;;

 delete m_Rod4Handler;
</code></pre>
<p>Code zu Stop-Thread:</p>
<pre><code>if(m_CanInit==false)
	ReleaseRod4();
 this-&gt;Terminate();
 m_ThreadRunning=false;
 m_CanGetBild=false;
 //alles wieder freigeben
 m_aktStatus=&quot;Beende dll&quot;;
 m_lastError=-1;
 m_AnzMesspunkte=0;
 m_PunkteAvailable=false;
 m_CanInit=true;
 m_aktBildStatus=STATUS_NOTHING;
</code></pre>
<p>Soweit funktioniert auch alles super.</p>
<p>Wenn ich jedoch den thread beendet habe, und ihn danach wieder neu starte, so wird die execute-methode nur einmal ausgeführt, und nicht mehr.</p>
<p>Hatte schonmal jemand ähnliche probleme?</p>
<p>Mfg</p>
<p>Reinhold Fischer</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/166295/probleme-mit-tthread-bei-erneutem-start-wird-execute-nur-einmal-ausgeführt</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 23:17:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/166295.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Nov 2006 21:00:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit TThread - bei erneutem Start wird Execute nur einmal ausgeführt on Mon, 27 Nov 2006 21:00:31 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Ich habe eine normale Form, und ein TThread-Objekt.<br />
Klicke ich in der Form auf einen Button, wird das TThread-Objekt per new mit CreateSuspend=false initialisiert.</p>
<p>m_Rod4Handler ist ein TThread-Objekt.</p>
<pre><code>try
     {
	  m_Rod4Handler=new Rod4Handler(false);
     }
     catch(Exception*  e)
     {
	MessageBox(this-&gt;ClientHandle,e-&gt;Message.c_str(),&quot;Fehler&quot;,MB_OK);
	this-&gt;Close();
     }
     Timer1-&gt;Enabled=true;
</code></pre>
<p>In der Execute-Methode wird zuerst eine externe Dll geladen, einige initialisierungen gemacht, und dann wird in eine while schleife übergegangen:</p>
<pre><code>void __fastcall Rod4Handler::Execute()
{
	  //erstmal initialisieren
	  //dll dynamisch laden

	  if(m_CanInit)
	  {
	   //zeugs für rauschunterdrückung initialisieren
	   m_Bilder=new TMessung[m_AnzBilderRauschunterdrueckung];
	   for (int counter=0; counter&lt;m_AnzBilderRauschunterdrueckung; counter++)
	   {
		m_Bilder[counter].sPunkte=NULL;
	   }

	   //rod4 initialisierem
	   InitRod4();
	   LoadNullScan();
	   m_CanInit=false;
	  }
	  m_aktStatus=&quot;Threadrunning&quot;;

	  while(!this-&gt;Terminated)
	  {
	   //hauptschleife, die immerwieder durchlaufen wird
	   m_aktStatus=&quot;Hauptschleife&quot;;
	   if(m_aktBildStatus==STATUS_MAKENEWBILD)
	   {
		//ein rauschfreies bild, aus den gesammelten erstellen
		m_aktStatus=&quot;Neues bild wird erstellt.&quot;;
		CreateRauschfreiesBild();
		m_aktBildStatus=STATUS_NOTHING;
	   }
	  }

	 // ReleaseRod4();
	  m_aktStatus=&quot;Erfolgreich Released&quot;;
}
</code></pre>
<p>Zum beenden per Knopfdruck wird wieder ein Button in der Form gedrückt:</p>
<pre><code>//Timer1-&gt;Enabled=false;
 m_Rod4Handler-&gt;StopThread();
 Label1-&gt;Caption=&quot;Alles freigegeben&quot;;

 delete m_Rod4Handler;
</code></pre>
<p>Code zu Stop-Thread:</p>
<pre><code>if(m_CanInit==false)
	ReleaseRod4();
 this-&gt;Terminate();
 m_ThreadRunning=false;
 m_CanGetBild=false;
 //alles wieder freigeben
 m_aktStatus=&quot;Beende dll&quot;;
 m_lastError=-1;
 m_AnzMesspunkte=0;
 m_PunkteAvailable=false;
 m_CanInit=true;
 m_aktBildStatus=STATUS_NOTHING;
</code></pre>
<p>Soweit funktioniert auch alles super.</p>
<p>Wenn ich jedoch den thread beendet habe, und ihn danach wieder neu starte, so wird die execute-methode nur einmal ausgeführt, und nicht mehr.</p>
<p>Hatte schonmal jemand ähnliche probleme?</p>
<p>Mfg</p>
<p>Reinhold Fischer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1182723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1182723</guid><dc:creator><![CDATA[ReinholdFischer]]></dc:creator><pubDate>Mon, 27 Nov 2006 21:00:31 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit TThread - bei erneutem Start wird Execute nur einmal ausgeführt on Tue, 28 Nov 2006 15:11:50 GMT]]></title><description><![CDATA[<p>Wie erfolgt denn der &quot;Neustart&quot;?</p>
<p>Allgemein zum Thema Threads: Betrachte deine Execute-Methode als main. Wenn das Main durchgelaufen ist, wird das Programm beendet, ausser du verhinderst das. In deinem Fall wäre vermutlich eine Schleife angebracht, welche auf das Thread-Attribut Terminate prüft. Statt die Execute-Methode auslaufen zu lassen, lässt du als letzte Amtshandlung den Thread in den Suspendmodus gehen (TThread::Suspend). Möchtest du deinen Thread nochmals neu starten, weckst du ihn wieder auf (TThread::Resume).<br />
Dazu macht du noch eine Methode in deine Thread-Klasse welche Terminate heisst und etwa so aussieht:</p>
<pre><code class="language-cpp">TMyThread::Terminate(void)
{
    /* Die Schleife weckt den schlafenden Thread auf. Da Suspends verschachtelt 
     * werden können, kann ein mehrfacher Aufruf von Resume erforderlich sein... */
    while(this-&gt;Suspended)
    {
        this-&gt;Resume();
    }

    /* Aufruf der Terminate-MEthode in der Basisklasse */
    TThread::Terminate();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1183143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183143</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Tue, 28 Nov 2006 15:11:50 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit TThread - bei erneutem Start wird Execute nur einmal ausgeführt on Tue, 28 Nov 2006 16:19:12 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Also, der &quot;Neustart&quot; erfolgt zuerst durch freigeben der externen DLL , dann wird der Thread terminiert, und dann per delete die Instanz gelöscht.</p>
<p>Daraufhin wird die Instanz per new neu initialisiert.<br />
Und dann die externe DLl wieder geladen.</p>
<p>Mfg Reinhold fischer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183207</guid><dc:creator><![CDATA[ReinholdFischer]]></dc:creator><pubDate>Tue, 28 Nov 2006 16:19:12 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit TThread - bei erneutem Start wird Execute nur einmal ausgeführt on Tue, 28 Nov 2006 16:41:44 GMT]]></title><description><![CDATA[<p>Und dann wird der Thread nicht erneut ausgeführt? Halte ich nicht für wahrscheinlich.... Schon mal nen Breakpoint in den Start der Routine gesetzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1183216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1183216</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Tue, 28 Nov 2006 16:41:44 GMT</pubDate></item></channel></rss>