<?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[Frage zu TCriticalSection;]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen Thread programmiert.<br />
diesen erzeuge ich mit:</p>
<pre><code class="language-cpp">// thread erzeugen
  cMailThread * Thread = new cMailThread(true);

  // thread konfigurieren
  Thread-&gt;ProgressBar = ProgressBar1;
  Thread-&gt;setConfiguration(ConfigList);
  Thread-&gt;FilenameLabel = lFileValue;
  Thread-&gt;EmailNrLabel = lMailNrValue;
  Thread-&gt;Counter = lCountMailsValue;

  Thread-&gt;mailsgesamt = lCountMailsValue-&gt;Caption.ToInt();
  Thread-&gt;IdAntiFreeze = IdAntiFreeze; 

  // OnTerminateEvent setzten
  Thread-&gt;OnTerminate = ThreadDone;
  fMain-&gt;ThreadsRunning ++;
  ThreadsRunning ++;
  // thread starten
  Thread-&gt;Resume();

  Application-&gt;ProcessMessages();
</code></pre>
<p>der Thread hat ein TCriticalSection Property:</p>
<pre><code class="language-cpp">class cMailThread : public TThread
{
private: 
  TCriticalSection * Gate;
...
public:
  TIdPOP3 * NMPOP3;
...
</code></pre>
<p>In den Thread Methoden sperre andere Threads pauschal immer mit</p>
<pre><code class="language-cpp">Gate-&gt;Acquire();
</code></pre>
<p>und gebe sie am Ende mit</p>
<pre><code class="language-cpp">ate-&gt;Release();
</code></pre>
<p>wieder frei.<br />
Beispiel:</p>
<pre><code class="language-cpp">// Verbindungsdaten und grundeinstellungen setztn.
__fastcall cMailThread::setPop3()
  {
  Gate-&gt;Acquire();
  NMPOP3-&gt;ASCIIFilter = true;

  NMPOP3-&gt;Username = getListValue(&quot;USERID&quot;, ConfigList);
  NMPOP3-&gt;Password = getListValue(&quot;PASSWORD&quot;, ConfigList);
  NMPOP3-&gt;Host = getListValue(&quot;HOST&quot;, ConfigList);
  //NMPOP3-&gt;Port = getListValue(&quot;PORT&quot;, ConfigList).ToInt();

  if (getListValue(&quot;DELETEMAIL&quot;, ConfigList).operator ==(&quot;true&quot;))
    deleteMail = true;
  else
    deleteMail = false;

  FileExtension = &quot;.&quot; + getListValue(&quot;FILEEXTENSION&quot;, ConfigList);
  Gate-&gt;Release();
  }
</code></pre>
<p>Alle Änderungen die der Thread in einem TFrame vornimmt, werden durch eine Funktion mit Synchronize() aufgerufen.</p>
<p>Nach meinem Verständnis sollte der Thread jetzt eingentlich Threadsicher sein.<br />
Trotz alledem bekomme ich sobald mehr als ein Thread läüft massenweise Exceptions:</p>
<blockquote>
<p>Zu wenig Arbeitsspeicher</p>
</blockquote>
<p>Daher zwei Fragen:<br />
1. Habe ich beim &quot;Threadsicher machen&quot; etwas falsch gemacht?<br />
2. Ist es sinnvoll die Methoden durch ein KLassenobjeckt von TCriticalSection zu sperren, oder muss das TCriticalSection Objeckt jeweils in der Methode in der es verwendet wird erzeugt und gelöscht werden?</p>
<p>Danke!</p>
<p>P.s. Sorry für die verwirrende Namensgebung von NMPOP3. Das Objekt ist ein Objeckt der Klasse TIdPOP3.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/106622/frage-zu-tcriticalsection</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Jul 2026 08:12:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/106622.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Apr 2005 07:53:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu TCriticalSection; on Wed, 13 Apr 2005 11:01:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen Thread programmiert.<br />
diesen erzeuge ich mit:</p>
<pre><code class="language-cpp">// thread erzeugen
  cMailThread * Thread = new cMailThread(true);

  // thread konfigurieren
  Thread-&gt;ProgressBar = ProgressBar1;
  Thread-&gt;setConfiguration(ConfigList);
  Thread-&gt;FilenameLabel = lFileValue;
  Thread-&gt;EmailNrLabel = lMailNrValue;
  Thread-&gt;Counter = lCountMailsValue;

  Thread-&gt;mailsgesamt = lCountMailsValue-&gt;Caption.ToInt();
  Thread-&gt;IdAntiFreeze = IdAntiFreeze; 

  // OnTerminateEvent setzten
  Thread-&gt;OnTerminate = ThreadDone;
  fMain-&gt;ThreadsRunning ++;
  ThreadsRunning ++;
  // thread starten
  Thread-&gt;Resume();

  Application-&gt;ProcessMessages();
</code></pre>
<p>der Thread hat ein TCriticalSection Property:</p>
<pre><code class="language-cpp">class cMailThread : public TThread
{
private: 
  TCriticalSection * Gate;
...
public:
  TIdPOP3 * NMPOP3;
...
</code></pre>
<p>In den Thread Methoden sperre andere Threads pauschal immer mit</p>
<pre><code class="language-cpp">Gate-&gt;Acquire();
</code></pre>
<p>und gebe sie am Ende mit</p>
<pre><code class="language-cpp">ate-&gt;Release();
</code></pre>
<p>wieder frei.<br />
Beispiel:</p>
<pre><code class="language-cpp">// Verbindungsdaten und grundeinstellungen setztn.
__fastcall cMailThread::setPop3()
  {
  Gate-&gt;Acquire();
  NMPOP3-&gt;ASCIIFilter = true;

  NMPOP3-&gt;Username = getListValue(&quot;USERID&quot;, ConfigList);
  NMPOP3-&gt;Password = getListValue(&quot;PASSWORD&quot;, ConfigList);
  NMPOP3-&gt;Host = getListValue(&quot;HOST&quot;, ConfigList);
  //NMPOP3-&gt;Port = getListValue(&quot;PORT&quot;, ConfigList).ToInt();

  if (getListValue(&quot;DELETEMAIL&quot;, ConfigList).operator ==(&quot;true&quot;))
    deleteMail = true;
  else
    deleteMail = false;

  FileExtension = &quot;.&quot; + getListValue(&quot;FILEEXTENSION&quot;, ConfigList);
  Gate-&gt;Release();
  }
</code></pre>
<p>Alle Änderungen die der Thread in einem TFrame vornimmt, werden durch eine Funktion mit Synchronize() aufgerufen.</p>
<p>Nach meinem Verständnis sollte der Thread jetzt eingentlich Threadsicher sein.<br />
Trotz alledem bekomme ich sobald mehr als ein Thread läüft massenweise Exceptions:</p>
<blockquote>
<p>Zu wenig Arbeitsspeicher</p>
</blockquote>
<p>Daher zwei Fragen:<br />
1. Habe ich beim &quot;Threadsicher machen&quot; etwas falsch gemacht?<br />
2. Ist es sinnvoll die Methoden durch ein KLassenobjeckt von TCriticalSection zu sperren, oder muss das TCriticalSection Objeckt jeweils in der Methode in der es verwendet wird erzeugt und gelöscht werden?</p>
<p>Danke!</p>
<p>P.s. Sorry für die verwirrende Namensgebung von NMPOP3. Das Objekt ist ein Objeckt der Klasse TIdPOP3.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/764534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/764534</guid><dc:creator><![CDATA[Clip]]></dc:creator><pubDate>Wed, 13 Apr 2005 11:01:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TCriticalSection; on Wed, 13 Apr 2005 07:19:01 GMT]]></title><description><![CDATA[<p>niemand? Schade <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Ab wann wird denn die Suchfunktion voraussichtlich wieder funktionieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765308</guid><dc:creator><![CDATA[Clip]]></dc:creator><pubDate>Wed, 13 Apr 2005 07:19:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TCriticalSection; on Wed, 13 Apr 2005 08:10:39 GMT]]></title><description><![CDATA[<p>Hab ich hier schon mal nach gesucht. Da gibt es nix aufschlussreiches...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765355</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 13 Apr 2005 08:10:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TCriticalSection; on Wed, 13 Apr 2005 08:13:06 GMT]]></title><description><![CDATA[<p>Da ich a) das Problem nicht ganz verstanden habe und mich auch b) grade nicht damit beschäftigen kann vielleicht folgender Hinweis:</p>
<p>Synchronize sorgt automatisch für Thread-Sicherheit.</p>
<p>Thread-Sicherheit wird dann benötigt, wenn zwei Threads gleichzeitig parallel laufen und beide auf gemeinsame Daten zugreifen.</p>
<p>Um eine Threadsicherheit zu erstellen ist es dann nötig, das Schreiben und das Lesen und nur das Schreiben und das Lesen des Speicherbereichs z.B. mit CriticalSections threadsicher zu machen.</p>
<p>Hast du also eine Funktion welche die Daten bezieht, dann sieht das so aus</p>
<pre><code class="language-cpp">...
char foo = 0;
LockMyCriticalSection
foo = threadunsafe_foo;
ReleaseMyCiticalSection

foo = doSomething(foo);

LockMyCriticalSection
threadunsafe_foo = foo;
ReleaseMyCriticalSection
...
</code></pre>
<p>Idealerweise ist &quot;threadunsafe_foo&quot; durch eine Zugriffsfunktion geschützt die eben dieses Lock und Release betreibt.</p>
<p>Verstehst du was ich meine?</p>
<p>-junix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765357</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Wed, 13 Apr 2005 08:13:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TCriticalSection; on Wed, 13 Apr 2005 08:16:02 GMT]]></title><description><![CDATA[<p>Ach so, da ich das damals auf die Schnelle machen musste und mit TCriticalSection nicht auf Anhieb klar gekommen bin, hab ich das Problem mit TThreadList und darin abgelegten Objekten umgangen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765359</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 13 Apr 2005 08:16:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TCriticalSection; on Wed, 13 Apr 2005 09:24:44 GMT]]></title><description><![CDATA[<p>Ah, Danke!<br />
das mit den Zugriffsfunktionen klingt logisch.</p>
<p>Synchronize hat leider den Nachteil, das man damit Meiner Meinung nach keine Funktionen mit Parametern aufrufen kann. Oder geht das doch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765408</guid><dc:creator><![CDATA[Clip]]></dc:creator><pubDate>Wed, 13 Apr 2005 09:24:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TCriticalSection; on Wed, 13 Apr 2005 09:29:40 GMT]]></title><description><![CDATA[<p>Nein, das geht nicht. Da hast du absolut recht. Wie gesagt: In aller Regel macht das Synchronisieren von ganzen Funktionen keinen Sinn. Denn im endeffekt müssen lediglich Schreib/Lese-Funktionen geschützt werden.</p>
<p>-junix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765416</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Wed, 13 Apr 2005 09:29:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TCriticalSection; on Wed, 13 Apr 2005 11:01:08 GMT]]></title><description><![CDATA[<p>Ich habe noch einige Fragen bez. Threads.</p>
<p>Welche Daten müssen Threadsicher gemacht werden?<br />
Ich erzeuge den Thread selber ja mit einem &quot;new&quot;</p>
<pre><code class="language-cpp">cMailThread * Thread = new cMailThread(true);
</code></pre>
<p>Der Thread wurde im Speicher also komplett neu angelegt. Meinem Verständis nach, müsste ich jetzt Properties des Threads selber nicht vor dem Zugriff anderer Threads schützen, da jeder Thread ja seine eigenen Daten im jeweils eigenen Speicher hat.<br />
Bedeutet dass, das lediglich Zugriffe auf Daten (Variablen, Files, etc.) ausserhalb des Threads geschützt werden müssen, oder liege ich mit meinen obigen Auführungen daneben?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765513</guid><dc:creator><![CDATA[Clip]]></dc:creator><pubDate>Wed, 13 Apr 2005 11:01:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu TCriticalSection; on Wed, 13 Apr 2005 11:10:59 GMT]]></title><description><![CDATA[<p>Clip schrieb:</p>
<blockquote>
<p>Bedeutet dass, das lediglich Zugriffe auf Daten (Variablen, Files, etc.) ausserhalb des Threads geschützt werden müssen, oder liege ich mit meinen obigen Auführungen daneben?</p>
</blockquote>
<p>Richtig. Du kannst dir diese Problematik ganz einfach vorstellen:</p>
<p>Stell dir vor, dein Speicherbereich ist eine Schublade die nach Links oder nach Rechts aus dem Schrank gezogen werden kann. Wenn jetzt nur immer einer links raus zieht (nur 1 Thread der auf den Speicherbereich zugreift), besteht kein Problem. Es kommt erst dann zukm Problem wenn einer Links einer Rechts steht (2 Threads die auf den selben Speicherbereich zugreifen) und die Möglichkeit besteht, dass beide gleichzeitig die Schublade öffnen wollen.</p>
<p>-junix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765522</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Wed, 13 Apr 2005 11:10:59 GMT</pubDate></item></channel></rss>