<?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[Kann man Threads &amp;quot;reinitialisieren&amp;quot;?]]></title><description><![CDATA[<p>Für eine Anwendung, die über die RS-232-Schnittstelle kommuniziert, habe ich eine Thread-Pool-Klasse geschrieben. Diese sollte nun die Möglichkeit bieten, alle gerade laufenden Tasks abzubrechen. Bisher löse ich das, indem ich die beschäftigten Threads terminiere und neu erstelle. Dies ist natürlich keine allzu saubere Lösung; zum einen warnt die Win32-SDK-Dokumentation ausdrücklich vor dieser Funktion, zum anderen geben die Funktionen innerhalb des Threads ihre Ressourcen nicht frei, wodurch im besten Fall nur Lecks entstehen. Nun kann ich aber schlecht in jeder innerhalb des Threads verwendeten etwas zeitaufwenigeren Funktion andauernd überprüfen, ob der Thread terminiert werden soll, und dann z.B. mittels einer Exception auf dem &quot;sicheren Weg&quot; die Ausführung beenden. Daher:</p>
<p>Gibt es eine Möglichkeit, einen Thread von einem anderen Thread aus zurückzusetzen, also z.B. so etwas wie ein longjmp() zum Anfang der Thread-Funktion zu erzwingen? Oder - noch besser - kann man eine Exception in einen anderen Thread &quot;injizieren&quot;? Falls nein, wie löse ich mein Problem am besten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/195753/kann-man-threads-quot-reinitialisieren-quot</link><generator>RSS for Node</generator><lastBuildDate>Mon, 29 Jun 2026 19:49:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/195753.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Oct 2007 15:36:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kann man Threads &amp;quot;reinitialisieren&amp;quot;? on Sun, 21 Oct 2007 15:36:40 GMT]]></title><description><![CDATA[<p>Für eine Anwendung, die über die RS-232-Schnittstelle kommuniziert, habe ich eine Thread-Pool-Klasse geschrieben. Diese sollte nun die Möglichkeit bieten, alle gerade laufenden Tasks abzubrechen. Bisher löse ich das, indem ich die beschäftigten Threads terminiere und neu erstelle. Dies ist natürlich keine allzu saubere Lösung; zum einen warnt die Win32-SDK-Dokumentation ausdrücklich vor dieser Funktion, zum anderen geben die Funktionen innerhalb des Threads ihre Ressourcen nicht frei, wodurch im besten Fall nur Lecks entstehen. Nun kann ich aber schlecht in jeder innerhalb des Threads verwendeten etwas zeitaufwenigeren Funktion andauernd überprüfen, ob der Thread terminiert werden soll, und dann z.B. mittels einer Exception auf dem &quot;sicheren Weg&quot; die Ausführung beenden. Daher:</p>
<p>Gibt es eine Möglichkeit, einen Thread von einem anderen Thread aus zurückzusetzen, also z.B. so etwas wie ein longjmp() zum Anfang der Thread-Funktion zu erzwingen? Oder - noch besser - kann man eine Exception in einen anderen Thread &quot;injizieren&quot;? Falls nein, wie löse ich mein Problem am besten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1389408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1389408</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sun, 21 Oct 2007 15:36:40 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man Threads &amp;quot;reinitialisieren&amp;quot;? on Sun, 21 Oct 2007 16:32:42 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">CloseHandle(hSerial);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1389425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1389425</guid><dc:creator><![CDATA[.,.]]></dc:creator><pubDate>Sun, 21 Oct 2007 16:32:42 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man Threads &amp;quot;reinitialisieren&amp;quot;? on Mon, 22 Oct 2007 20:31:37 GMT]]></title><description><![CDATA[<p>MSDN (CloseHandle) schrieb:</p>
<blockquote>
<p>Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, then close all handles to the thread.</p>
</blockquote>
<p>Scheint also nicht so ganz zu treffen. Außerdem suche ich nicht nur nach einem TerminateThread()-Ersatz, sondern, wie beschrieben, nach einer Möglichkeit, in einem anderen Thread eine Exception auszulösen, oder alternativ nach einem besseren Lösungsansatz für mein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390240</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Mon, 22 Oct 2007 20:31:37 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man Threads &amp;quot;reinitialisieren&amp;quot;? on Mon, 22 Oct 2007 20:36:57 GMT]]></title><description><![CDATA[<p>Ich meinte nicht das Thread-Handle sondern das Handle womit du die serielle Schnittstelle ansprichst. Dann wird die I/O Operation abgebrochen und du kannst prüfen ob der Thread beendet werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390241</guid><dc:creator><![CDATA[.,.]]></dc:creator><pubDate>Mon, 22 Oct 2007 20:36:57 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man Threads &amp;quot;reinitialisieren&amp;quot;? on Mon, 22 Oct 2007 20:52:38 GMT]]></title><description><![CDATA[<p>Das wäre denkbar, jedoch müßte ich dann bei jeder Verwendung des Handles dessen Gültigkeit verifizieren. Und eigentlich wollte ich die Möglichkeit des Abbrechens von Threads ohne Eingriff in die verwendeten Klassen und Funktionen, sondern innerhalb der Thread-Pool-Klasse implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390249</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Mon, 22 Oct 2007 20:52:38 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man Threads &amp;quot;reinitialisieren&amp;quot;? on Tue, 23 Oct 2007 06:12:32 GMT]]></title><description><![CDATA[<p>Man kann einen Thread so nicht zurücksetzen.<br />
Du kannsr aber z.B. ein Event setzen, das von einem anderen Thread aus gesetzt wird. Deine Threads müssten also auf mehrere Events warten können. Wenn der Reset-Event auftritt. handelst Du in dem Thread eben so wie es für einen Reset notwendig ist (indem entsprechdn z.B. die Ports geschlossen und neu geöffnet werden).</p>
<p>TerminateThread in Verbindung mit offenen seriellen Ports führt nur in Chaos und Probleme. Die entsprechenden Handle wreden nicht korrekt geschlossen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390306</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 23 Oct 2007 06:12:32 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man Threads &amp;quot;reinitialisieren&amp;quot;? on Tue, 23 Oct 2007 12:19:18 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<p>Man kann einen Thread so nicht zurücksetzen.</p>
</blockquote>
<p>Schade. Auch so etwas wie Remote-Exceptions gibt es nicht, oder?</p>
<p>Martin Richter schrieb:</p>
<blockquote>
<p>Du kannsr aber z.B. ein Event setzen, das von einem anderen Thread aus gesetzt wird. Deine Threads müssten also auf mehrere Events warten können. Wenn der Reset-Event auftritt. handelst Du in dem Thread eben so wie es für einen Reset notwendig ist (indem entsprechdn z.B. die Ports geschlossen und neu geöffnet werden).</p>
</blockquote>
<p>Das ist eben kein Ersatz für das Terminieren und hilft nicht, wenn eine aufgerufene Funktion noch beschäftigt ist. Natürlich wähle ich diesen Weg, wo möglich.</p>
<p>Martin Richter schrieb:</p>
<blockquote>
<p>TerminateThread in Verbindung mit offenen seriellen Ports führt nur in Chaos und Probleme. Die entsprechenden Handle wreden nicht korrekt geschlossen.</p>
</blockquote>
<p>Das mache ich bisher manuell vom Hauptthread aus, nachdem ich den Thread terminiert habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390520</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 23 Oct 2007 12:19:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man Threads &amp;quot;reinitialisieren&amp;quot;? on Tue, 23 Oct 2007 12:43:23 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Martin Richter schrieb:</p>
<blockquote>
<p>Du kannsr aber z.B. ein Event setzen, das von einem anderen Thread aus gesetzt wird. Deine Threads müssten also auf mehrere Events warten können. Wenn der Reset-Event auftritt. handelst Du in dem Thread eben so wie es für einen Reset notwendig ist (indem entsprechdn z.B. die Ports geschlossen und neu geöffnet werden).</p>
</blockquote>
<p>Das ist eben kein Ersatz für das Terminieren und hilft nicht, wenn eine aufgerufene Funktion noch beschäftigt ist. Natürlich wähle ich diesen Weg, wo möglich.</p>
</blockquote>
<p>Es sit zumindest das sicherste, was du machen kannst - einen anderen Thread mitten in irgendwelchen wichtigen Arbeiten abzuschießen ist hochgradig gefährlich (und sollte nur dann passieren, wenn er gerade dabei ist, dir das System zu zerstören). Ansonsten lass den Thread lieber selber entscheiden, wann es sicher ist, abzubrechen.</p>
<p>(PS: In meiner (Offline)-MSDN habe ich einen Q&amp;A-Eintrag zu Alternativmöglichkeiten gefunden, in der Online-MSDN leider nicht - such mal nach &quot;KillThrd&quot;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390532</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 23 Oct 2007 12:43:23 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man Threads &amp;quot;reinitialisieren&amp;quot;? on Tue, 23 Oct 2007 13:28:46 GMT]]></title><description><![CDATA[<p>audacia, das Problem ist dass es einfach nicht möglich ist in einem Thread eine Exception auszulösen so dass gleichzeitig sichergestellt ist dass alles weiterhin so funktioniert wie es sollte.</p>
<p>Viele Stellen, gerade in den OS-eigenen DLLs (USER, GDI, ...) sind nicht Exception safe, d.h. wenn dort eine Exception ausgelöst würde hätte das zur Folge dass irgendwas nicht so funktioniert wie es gedacht war. Kann sein dein Programm stürzt dann ab oder bleibt einfach hängen oder sonstwas unerwünschtes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390559</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 23 Oct 2007 13:28:46 GMT</pubDate></item><item><title><![CDATA[Reply to Kann man Threads &amp;quot;reinitialisieren&amp;quot;? on Tue, 23 Oct 2007 14:21:32 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>(PS: In meiner (Offline)-MSDN habe ich einen Q&amp;A-Eintrag zu Alternativmöglichkeiten gefunden, in der Online-MSDN leider nicht - such mal nach &quot;KillThrd&quot;)</p>
</blockquote>
<p>Das habe ich <a href="http://www.microsoft.com/msj/archive/SFFF.aspx" rel="nofollow">hier</a> gefunden - vielen Dank für den Hinweis!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390594</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 23 Oct 2007 14:21:32 GMT</pubDate></item></channel></rss>