<?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[TCriticalSection im Thread-Header deklariert.]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Multi-Thread-Applikation. Jetzt stoppe (suspend()) ich den Thread in einem gewissen Zustand. Ich habe eine TCriticalSection im Thread-Header deklariert. Wenn ich mittels Acquire() auf die TCS zugreiffe und der Thread suspended ist, bleibt meine Anwendung hängen.<br />
Werden public-Variablen auch suspendiert?<br />
Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/113399/tcriticalsection-im-thread-header-deklariert</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 08:14:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/113399.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Jun 2005 13:49:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to TCriticalSection im Thread-Header deklariert. on Wed, 22 Jun 2005 13:49:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Multi-Thread-Applikation. Jetzt stoppe (suspend()) ich den Thread in einem gewissen Zustand. Ich habe eine TCriticalSection im Thread-Header deklariert. Wenn ich mittels Acquire() auf die TCS zugreiffe und der Thread suspended ist, bleibt meine Anwendung hängen.<br />
Werden public-Variablen auch suspendiert?<br />
Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/814846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/814846</guid><dc:creator><![CDATA[roN]]></dc:creator><pubDate>Wed, 22 Jun 2005 13:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to TCriticalSection im Thread-Header deklariert. on Thu, 23 Jun 2005 09:09:59 GMT]]></title><description><![CDATA[<p>Besteht nicht viel eher die Möglichkeit, das der Thread genau dann suspendiert wurde, wenn du in der CS steckst? Dann ist es naheliegend, das eine weitere Aquisition der CS einen Deadlock verursacht...</p>
<p>Folgende UMgehungsmöglichkeit würde ich vorschlagen:</p>
<p>Überschreib in deiner Threadableitung die Funktion &quot;Suspend&quot; und setzte in ihr lediglich ein SuspendRequest-Flag. Anschliessend prüfst du an einer sicheren Stelle in deinem Thread-Loop (z.B. vor jeder Aquise oder nach jedem Release der CS), ob das Flag gesetzt ist, und rufst - sollte es so sein - die Funktion TThread::Suspended() (genau so schreiben) auf. Damit hast du gewährleistet, das du sicher aus der CriticalSection raus bist, wenn der Thread zwangsruhe verordnet bekommt.</p>
<p>Eventuell würde es sich, angesichts dieser neuen Gesichtspunkte, auch lohnen, die CS über eine funktion zu aquirieren und freizugeben, die eben diese Prüfung vor nimmt. Damit könntest du dann auch die CS aus dem Public-Bereich (grr) deiner Klasse entfernen und brav in den Private-Bereich verschieben, wo sie auch hingehört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/815359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/815359</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Thu, 23 Jun 2005 09:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to TCriticalSection im Thread-Header deklariert. on Thu, 23 Jun 2005 09:19:44 GMT]]></title><description><![CDATA[<p>junix schrieb:</p>
<blockquote>
<p>Besteht nicht viel eher die Möglichkeit, das der Thread genau dann suspendiert wurde, wenn du in der CS steckst? Dann ist es naheliegend, das eine weitere Aquisition der CS einen Deadlock verursacht...</p>
<p>Folgende UMgehungsmöglichkeit würde ich vorschlagen:</p>
<p>Überschreib in deiner Threadableitung die Funktion &quot;Suspend&quot; und setzte in ihr lediglich ein SuspendRequest-Flag. Anschliessend prüfst du an einer sicheren Stelle in deinem Thread-Loop (z.B. vor jeder Aquise oder nach jedem Release der CS), ob das Flag gesetzt ist, und rufst - sollte es so sein - die Funktion TThread::Suspended() (genau so schreiben) auf. Damit hast du gewährleistet, das du sicher aus der CriticalSection raus bist, wenn der Thread zwangsruhe verordnet bekommt.</p>
<p>Eventuell würde es sich, angesichts dieser neuen Gesichtspunkte, auch lohnen, die CS über eine funktion zu aquirieren und freizugeben, die eben diese Prüfung vor nimmt. Damit könntest du dann auch die CS aus dem Public-Bereich (grr) deiner Klasse entfernen und brav in den Private-Bereich verschieben, wo sie auch hingehört.</p>
</blockquote>
<p>hoi junix ;),</p>
<p>ich hab' das problem bereits anders gelöst nähmlich setzt ich in meiner Applikation ein Flag wenn ich den Thread nicht brauche, rufe das Flag im Thread bei jedem durchlauf auf und zweige in einen Stand-By-Mode ab, etwa so:</p>
<pre><code class="language-cpp">void __fastcall TMeinThread::Execute()
{

while (!Terminated)
  {
  switch(Flag)
    {
    case DEF_IDLE:
      Priority = tpIdle;          // Priorität auf idle setzten
      Synchronize(Main_Frm-&gt;WriteTrace); // diese kleine Sache ist eben doch nötig, desshalb auch kein suspend
      Sleep(1);                   // Wenn ich den nicht drin habe, zeigt Windows im Taskmanager 99% CPU Nutzung an
      Application-&gt;ProcessMessages();
    break;
    case DEF_RUN:
//    Ganzer Threadcode welcher schlafen geschikt wurde
//    Ganzer Threadcode welcher schlafen geschikt wurde
//    Ganzer Threadcode welcher schlafen geschikt wurde
    break; 
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/815370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/815370</guid><dc:creator><![CDATA[roN]]></dc:creator><pubDate>Thu, 23 Jun 2005 09:19:44 GMT</pubDate></item><item><title><![CDATA[Reply to TCriticalSection im Thread-Header deklariert. on Thu, 23 Jun 2005 09:33:58 GMT]]></title><description><![CDATA[<p>Ist doch eigentlich ganz ähnlich zu meinem Vorschlag.</p>
<p>Äh ... wozu Application ProcessMessages? Und du bist dir bewusst, das du so theoretisch unendlich schnell hintereinander &quot;Main_Frm-&gt;WriteTrace&quot; aufrufst? Das kann ja nicht der Sinn sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/815381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/815381</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Thu, 23 Jun 2005 09:33:58 GMT</pubDate></item><item><title><![CDATA[Reply to TCriticalSection im Thread-Header deklariert. on Thu, 23 Jun 2005 12:30:25 GMT]]></title><description><![CDATA[<p>junix schrieb:</p>
<blockquote>
<p>Ist doch eigentlich ganz ähnlich zu meinem Vorschlag.</p>
<p>Äh ... wozu Application ProcessMessages? Und du bist dir bewusst, das du so theoretisch unendlich schnell hintereinander &quot;Main_Frm-&gt;WriteTrace&quot; aufrufst? Das kann ja nicht der Sinn sein?</p>
</blockquote>
<p>hm, ist mir schon klar, soll ich den delay eher 100ms gross machen?<br />
verpassen kann ich erh nicht, die Daten zum tracen liegen in einer STL::Queue und ich der Funktion &quot;Main_Frm-&gt;WriteTrace&quot; lese ich ledigli h die Queue aus...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/815541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/815541</guid><dc:creator><![CDATA[roN]]></dc:creator><pubDate>Thu, 23 Jun 2005 12:30:25 GMT</pubDate></item><item><title><![CDATA[Reply to TCriticalSection im Thread-Header deklariert. on Thu, 23 Jun 2005 12:31:30 GMT]]></title><description><![CDATA[<p>junix schrieb:</p>
<blockquote>
<p>Man ist so alt wie man sich fühlt... - Augenblick! Wo zum Henker bleibt meine Rente?!?</p>
</blockquote>
<p>Ach ja, hehe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/815542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/815542</guid><dc:creator><![CDATA[roN]]></dc:creator><pubDate>Thu, 23 Jun 2005 12:31:30 GMT</pubDate></item><item><title><![CDATA[Reply to TCriticalSection im Thread-Header deklariert. on Thu, 23 Jun 2005 12:36:00 GMT]]></title><description><![CDATA[<p>roN schrieb:</p>
<blockquote>
<p>junix schrieb:</p>
<blockquote>
<p>Ist doch eigentlich ganz ähnlich zu meinem Vorschlag.</p>
<p>Äh ... wozu Application ProcessMessages? Und du bist dir bewusst, das du so theoretisch unendlich schnell hintereinander &quot;Main_Frm-&gt;WriteTrace&quot; aufrufst? Das kann ja nicht der Sinn sein?</p>
</blockquote>
<p>hm, ist mir schon klar, soll ich den delay eher 100ms gross machen?<br />
verpassen kann ich erh nicht, die Daten zum tracen liegen in einer STL::Queue und ich der Funktion &quot;Main_Frm-&gt;WriteTrace&quot; lese ich ledigli h die Queue aus...</p>
</blockquote>
<p>Wieso nicht irgendwie dann wenns sinn macht? Nämlich beim Zeichnen des formulars oder bei der Ankunft neuer Daten?<br />
Keine Ahnung was für ne Updaterate du haben willst. Aber 1ms wären ja rund 1000 Bilder / Sekunde ... da ein Bildschrim es aber grade mal auf 60-100 Bilder/Sekunde schafft - mal ganz abgesehen von der Zeichnungsengine - dünkt mich das reichlich übertrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/815549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/815549</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Thu, 23 Jun 2005 12:36:00 GMT</pubDate></item><item><title><![CDATA[Reply to TCriticalSection im Thread-Header deklariert. on Thu, 23 Jun 2005 12:38:27 GMT]]></title><description><![CDATA[<p>junix schrieb:</p>
<blockquote>
<p>Wieso nicht irgendwie dann wenns sinn macht? Nämlich beim Zeichnen des formulars oder bei der Ankunft neuer Daten?<br />
Keine Ahnung was für ne Updaterate du haben willst. Aber 1ms wären ja rund 1000 Bilder / Sekunde ... da ein Bildschrim es aber grade mal auf 60-100 Bilder/Sekunde schafft - mal ganz abgesehen von der Zeichnungsengine - dünkt mich das reichlich übertrieben.</p>
</blockquote>
<p>Ich prüfe in der Funktion, ob noch Daten in der Queue vorhanden sind. Wenn keine mehr drin sind, komm' ich gleich wieder zurück...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/815553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/815553</guid><dc:creator><![CDATA[roN]]></dc:creator><pubDate>Thu, 23 Jun 2005 12:38:27 GMT</pubDate></item><item><title><![CDATA[Reply to TCriticalSection im Thread-Header deklariert. on Thu, 23 Jun 2005 12:46:20 GMT]]></title><description><![CDATA[<p>Naja wie gesagt... die Häufigkeit ist der Eine Punkt. Der verschwendete Jump ein anderer. Vielleicht wäre es eleganter, auf ein Event zu warten, das beim eintreffen von Daten in die Queue gesetzt und auf das mittels Warte-Funktion im Thread gewartet (in dem die Zeit ans OS übergeben wird) wird? Das bringt die absolut minimalste CPU auslastung...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/815566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/815566</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Thu, 23 Jun 2005 12:46:20 GMT</pubDate></item><item><title><![CDATA[Reply to TCriticalSection im Thread-Header deklariert. on Thu, 23 Jun 2005 12:49:53 GMT]]></title><description><![CDATA[<p>junix schrieb:</p>
<blockquote>
<p>Naja wie gesagt... die Häufigkeit ist der Eine Punkt. Der verschwendete Jump ein anderer. Vielleicht wäre es eleganter, auf ein Event zu warten, das beim eintreffen von Daten in die Queue gesetzt und auf das mittels Warte-Funktion im Thread gewartet (in dem die Zeit ans OS übergeben wird) wird? Das bringt die absolut minimalste CPU auslastung...</p>
</blockquote>
<p>Das ist korrekt, ich werde mal sehen, was sich tun lässt. Danke für den Tipp auf jedenfall. <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/815571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/815571</guid><dc:creator><![CDATA[roN]]></dc:creator><pubDate>Thu, 23 Jun 2005 12:49:53 GMT</pubDate></item></channel></rss>