<?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[Datenübergabe zwischen zwei Threads]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich beschreibe vielleicht erst mal, was ich erreichen will: Ich schicke Nachrichten zu einem Busteilnehmer, der dann kurz darauf eine Antwort zurücksendet. Die Antwort kann auch auf mehrere Nachrichten aufgeteilt sein.</p>
<p>Jetzt habe ich eine Klasse Receiver von TThread abgeleitet, die in einer Endlosschleife alle Busnachrichten empfängt und in eine Queue (hab deque verwendet) einfügt. Außerdem besitzt die Klasse Receiver eine Methode getMessages, die eine Kopie der Queue zurückgibt, und die Queue anschließend leert.</p>
<pre><code class="language-cpp">void __fastcall Receiver::Execute()
{
while(1) {
    myOpto-&gt;Receive(erg,source,newmessage,cont,999);
    MostMessage message;
    message.setMessage(erg);
    message.setSource(*source);
    messagequeue.push_back(message);
    }
}

deque&lt;MostMessage&gt; Receiver::getMessages(bool clear)
{
deque&lt;MostMessage&gt; erg;
erg = messagequeue;
if(clear) messagequeue.clear();
return erg;
}
</code></pre>
<p>Wenn ich jetzt von einem Busteilnehmer was wissen will, sende ich von meinem Form die Anfrage auf den Bus, warte eine gewisse Zeit, rufe dann getMessages vom Receiver auf und suche in der Nachrichtenqueue nach der Antwort.</p>
<p>Nun das Problem: In der Queue, die ich von getMessages bekomme, fehlen manchmal die gesuchten Nachrichten, obwohl sie ziemlich sicher empfangen wurden.</p>
<p>Wie ist das überhaupt genau mit den Threads? Alles was ich in die Methode &quot;Execute&quot; schreibe, wird parallel zum restlichen Programmablauf ausgeführt. Aber wie verhält es sich mit den anderen Methoden, wie beispielsweise getMessages? Muss ich vielleicht Vorkehrungen treffen, die verhindern, dass Execute und getMessages zeitgleich auf die Queue zugreifen?</p>
<p>Ich danke euch schon jetzt<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/124543/datenübergabe-zwischen-zwei-threads</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 14:21:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/124543.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Oct 2005 13:27:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Fri, 28 Oct 2005 13:27:09 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich beschreibe vielleicht erst mal, was ich erreichen will: Ich schicke Nachrichten zu einem Busteilnehmer, der dann kurz darauf eine Antwort zurücksendet. Die Antwort kann auch auf mehrere Nachrichten aufgeteilt sein.</p>
<p>Jetzt habe ich eine Klasse Receiver von TThread abgeleitet, die in einer Endlosschleife alle Busnachrichten empfängt und in eine Queue (hab deque verwendet) einfügt. Außerdem besitzt die Klasse Receiver eine Methode getMessages, die eine Kopie der Queue zurückgibt, und die Queue anschließend leert.</p>
<pre><code class="language-cpp">void __fastcall Receiver::Execute()
{
while(1) {
    myOpto-&gt;Receive(erg,source,newmessage,cont,999);
    MostMessage message;
    message.setMessage(erg);
    message.setSource(*source);
    messagequeue.push_back(message);
    }
}

deque&lt;MostMessage&gt; Receiver::getMessages(bool clear)
{
deque&lt;MostMessage&gt; erg;
erg = messagequeue;
if(clear) messagequeue.clear();
return erg;
}
</code></pre>
<p>Wenn ich jetzt von einem Busteilnehmer was wissen will, sende ich von meinem Form die Anfrage auf den Bus, warte eine gewisse Zeit, rufe dann getMessages vom Receiver auf und suche in der Nachrichtenqueue nach der Antwort.</p>
<p>Nun das Problem: In der Queue, die ich von getMessages bekomme, fehlen manchmal die gesuchten Nachrichten, obwohl sie ziemlich sicher empfangen wurden.</p>
<p>Wie ist das überhaupt genau mit den Threads? Alles was ich in die Methode &quot;Execute&quot; schreibe, wird parallel zum restlichen Programmablauf ausgeführt. Aber wie verhält es sich mit den anderen Methoden, wie beispielsweise getMessages? Muss ich vielleicht Vorkehrungen treffen, die verhindern, dass Execute und getMessages zeitgleich auf die Queue zugreifen?</p>
<p>Ich danke euch schon jetzt<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/902803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/902803</guid><dc:creator><![CDATA[Winzler]]></dc:creator><pubDate>Fri, 28 Oct 2005 13:27:09 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Fri, 28 Oct 2005 15:50:58 GMT]]></title><description><![CDATA[<p>In der BCB-HIlfe steht viel zum Thema Multithreading. Lies da mal etwas darüber nach... Deine Ahnung ist richtig: Du musst vorkehrungen treffen. Und zwar dort wo Daten gelesen und geschrieben werden. Schreib - und lesevorgang werden in der Regel über sogenannte CriticalSections geschützt... auch hier solltest du dich mal kurz etwas einlesen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/902894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/902894</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Fri, 28 Oct 2005 15:50:58 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Wed, 02 Nov 2005 14:57:38 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich hab jetzt versucht, die kritischen Stellen durch critical Section zu schützen. Dennoch besteht mein Problem weiterhin.</p>
<p>Hier nochmal mein Problem etwas genauer:</p>
<p>Hier ist ein Beispiel für eine Methode, die getData aus der Klasse Receiver aufruft. Es wird also ein Befehl gesendet und kurze Zeit später nach der Antwort in den empfangenen Nachrichten gesucht:</p>
<pre><code class="language-cpp">bool Most::isTA(void)
{
bool erg = false;
AnsiString HEXMessage = &quot;40&quot; + InstIdTuner + &quot;4561&quot;;
myOptolyzer-&gt;Send(HEXMessage.c_str(), NodeAdressTuner);
Sleep(500);
String searchstring = &quot;40&quot; + InstIdTuner + &quot;456C&quot;;
String result;
result = myReceiver-&gt;getData(searchstring);
if (result != &quot;nix&quot;)
   {
    if (result == &quot;1&quot;) erg = true;
   }
return erg;
}
</code></pre>
<p>Dummerweise kommt von getData sehr häufig &quot;nix&quot; zurück. Ich hab auch schon Sleep-Zeit variiert, daran liegt es nicht.</p>
<p>Hier die Methoden getMessages und getData. getMessages holt die aktuell empfangenen Nachrichten ab und löscht die Queue anschließend. getData sucht in den Messages nach der richtigen Message.</p>
<pre><code class="language-cpp">deque&lt;MostMessage&gt; Receiver::getMessages(bool clear)
{
deque&lt;MostMessage&gt; erg;
Sperre-&gt;Acquire();
try {
   erg = messagequeue;
   if(clear) messagequeue.clear();
   }
__finally {
   Sperre-&gt;Release();
   return erg;
   }
}

String Receiver::getData(String header)
{
deque&lt;MostMessage&gt; messages;
String temp;
String erg = &quot;nix&quot;;
messages = getMessages(true);
for(unsigned int i=0;i&lt;messages.size();i++)
        {
        temp = (messages.at(i)).getMessage();

        if (temp.SubString(1,header.Length()) == header)
                {
                int length = 0;
                String lengthstring;
                lengthstring = temp.SubString(header.Length() + 1, 2);
                lengthstring = &quot;0x&quot; + lengthstring;
                length = lengthstring.ToInt();
                erg = temp.SubString(header.Length() + 3, length * 2);
                }
        }
return erg;
}
</code></pre>
<p>Auf meinem Form hab ich einen Button, wo ich mir die aktuellen Messages augeben lassen kann:</p>
<pre><code class="language-cpp">void __fastcall TForm1::Button2Click(TObject *Sender)
{
deque&lt;MostMessage&gt; messagequeue;
messagequeue = myMost-&gt;myReceiver-&gt;getMessages(true);
Memo1-&gt;Clear();
for (unsigned int i=0;i&lt;messagequeue.size();i++)
   {
   AnsiString line;
   line = (messagequeue[i]).getMessage();
   Memo1-&gt;Lines-&gt;Add(line);
   }
}
</code></pre>
<p>Das seltsame ist nun:<br />
Bei der Methdoe &quot;isTA&quot; kommt kein Ergebnis heraus. Wenn ich aber kurz danach den Button drücke, sehe ich die gesuchte Message. Eigentlich dürften aber in der Queue nach dem Aufruf von getMessages überhaupt keine Nachrichten mehr drin sein.</p>
<p>Kann mir jemand sagen, woran das liegen könnte?</p>
<p>Grüße<br />
Winzler</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906521</guid><dc:creator><![CDATA[Winzler]]></dc:creator><pubDate>Wed, 02 Nov 2005 14:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Wed, 02 Nov 2005 15:39:07 GMT]]></title><description><![CDATA[<p>Ist der Code in dem die Queue gefüllt wird auch Threadsicher?</p>
<p>Ich empfehle dir, eine Klasse von der Queue privat abzuleiten, und die Zugriffe threadsicher zu machen (Getter- und Setter-Funktionen, die bei Lese / Schreibzugriffen auf die Queue die Critical Section für sich beanspruchen)</p>
<p>Anschliessend im Rahmen des Threads die Threadsafe queue verwenden.</p>
<p>Alternativ kannst du diese Queue hier verwenden. Dann musst du aber jeden Zugriff auf die Queue durch CriticalSections absichern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906562</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Wed, 02 Nov 2005 15:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Fri, 04 Nov 2005 18:43:49 GMT]]></title><description><![CDATA[<ol>
<li></li>
</ol>
<p>Sofern die Queue eine Klasse der Standard Template Libary ist, ist die definitiv Threadsicher!<br />
CriticalSections, Semaphoren etc. sind da überflüssig!</p>
<ol start="2">
<li></li>
</ol>
<p>Dann wirkt manchmal statt nur &quot;Sleep()&quot; sowas hier Wunder:</p>
<pre><code class="language-cpp">...
Sleep(500);
Application-&gt;ProcessMessages();
...
</code></pre>
<ol start="3">
<li></li>
</ol>
<p>3.1. Du hast den Aufruf &quot;messages = getMessages(true);&quot;.<br />
3.2. In deiner getMessages()-Funktion machst du ein &quot;if(clear) messagequeue.clear();&quot;.<br />
3.3. Dann hast du die for-Schleife &quot;for(unsigned int i=0;i&lt;messages.size();i++)&quot;, messages.size() ist aber 0 wgen 3.2., du gehst also nie in die for-Schleife.<br />
3.4. Wenn ich jetzt nix übersehen habe, würde ich dir auch immer &quot;nix&quot; zurückgeben wenn ich deine Funktion wäre. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
<p>Ich hab das mal so doof nummeriert, damit ich selbst den durchblick behalte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
<p>Noch als kleiner Gedankengang für mich: Warum gibst du eigentlich nicht einfach einen Zeiger auf deine Queue zurück statt ner Kopie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908398</guid><dc:creator><![CDATA[el Clio]]></dc:creator><pubDate>Fri, 04 Nov 2005 18:43:49 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Fri, 04 Nov 2005 20:27:27 GMT]]></title><description><![CDATA[<p>el Clio schrieb:</p>
<blockquote>
<ol>
<li></li>
</ol>
<p>Sofern die Queue eine Klasse der Standard Template Libary ist, ist die definitiv Threadsicher!<br />
CriticalSections, Semaphoren etc. sind da überflüssig!</p>
</blockquote>
<p>Quelle?</p>
<p>el Clio schrieb:</p>
<blockquote>
<ol start="2">
<li></li>
</ol>
<p>Dann wirkt manchmal statt nur &quot;Sleep()&quot; sowas hier Wunder:</p>
<pre><code class="language-cpp">...
Sleep(500);
Application-&gt;ProcessMessages();
...
</code></pre>
</blockquote>
<p>Wieso?</p>
<blockquote>
<p>3.4. Wenn ich jetzt nix übersehen habe, würde ich dir auch immer &quot;nix&quot; zurückgeben wenn ich deine Funktion wäre. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
</blockquote>
<p>Du hast was übersehen:</p>
<pre><code class="language-cpp">erg = messagequeue;
</code></pre>
<blockquote>
<p>Noch als kleiner Gedankengang für mich: Warum gibst du eigentlich nicht einfach einen Zeiger auf deine Queue zurück statt ner Kopie?</p>
</blockquote>
<p>Weil die Queue änderungen unterworfen ist, und man ja nicht immer den Thread wieder unterbrechen will mit kurzen zugriffen? Man sollte nie Zeiger auf klasseninterne Datenstrukturen zurückliefern. Das gefährdet die Integrität</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908456</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Fri, 04 Nov 2005 20:27:27 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Fri, 04 Nov 2005 23:04:22 GMT]]></title><description><![CDATA[<p>junix schrieb:</p>
<blockquote>
<p>el Clio schrieb:</p>
<blockquote>
<ol>
<li></li>
</ol>
<p>Sofern die Queue eine Klasse der Standard Template Libary ist, ist die definitiv Threadsicher!<br />
CriticalSections, Semaphoren etc. sind da überflüssig!</p>
</blockquote>
<p>Quelle?</p>
</blockquote>
<p>Weiß nicht mehr ganz genau, meine aber STL doku.</p>
<p>junix schrieb:</p>
<blockquote>
<p>el Clio schrieb:</p>
<blockquote>
<ol start="2">
<li></li>
</ol>
<p>Dann wirkt manchmal statt nur &quot;Sleep()&quot; sowas hier Wunder:</p>
<pre><code class="language-cpp">...
Sleep(500);
Application-&gt;ProcessMessages();
...
</code></pre>
</blockquote>
<p>Wieso?</p>
</blockquote>
<p>Pure Erfahrung. Grade bei dem vcl-Thread-Zeugs ist ein abarbeiten der der Nachrichten ab und an mal sinnvoll.<br />
Hatte auch schon mal ein ähnliches Problem, daß ich was losgeschickt habe, mit Sleep(), also blockierend gewartet habe und dann die Antwort abfragen wollte. Ergebnis: Mal gings, mal nicht.<br />
Durch Application-&gt;ProcessMessages(), also durch schäbiges pollen gings dann wie von Zauberhand.</p>
<p>junix schrieb:</p>
<blockquote>
<blockquote>
<p>3.4. Wenn ich jetzt nix übersehen habe, würde ich dir auch immer &quot;nix&quot; zurückgeben wenn ich deine Funktion wäre. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
</blockquote>
<p>Du hast was übersehen:</p>
<pre><code class="language-cpp">erg = messagequeue;
</code></pre>
</blockquote>
<p>Mist! Ich wusste, daß sowas kommt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
<p>junix schrieb:</p>
<blockquote>
<blockquote>
<p>Noch als kleiner Gedankengang für mich: Warum gibst du eigentlich nicht einfach einen Zeiger auf deine Queue zurück statt ner Kopie?</p>
</blockquote>
<p>Weil die Queue änderungen unterworfen ist, und man ja nicht immer den Thread wieder unterbrechen will mit kurzen zugriffen? Man sollte nie Zeiger auf klasseninterne Datenstrukturen zurückliefern. Das gefährdet die Integrität</p>
</blockquote>
<p>Ja, ok! Hab nix gesagt! Je nach größe der Queue und je nach Größe der vorhandenen recourcen ist es aber manchmal sinnvoller die integrität zu gefährden, dafür aber auf die ewigen kopierereien zu verzichten. So dachte ich eigentlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":-P"
      alt="😛"
    /></p>
<p>Egal. Waren alles nur so Gedanken! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
<p>Unter dem Anspeckt, daß er nun doch in die for-Schleife läuft würde mich mal interessieren, was so debug-mäßig in temp steht, also ob da vernündtiger Inhalt ankommt. Als nächstes würde mich dann interessieren, was der SubString() (von der Funktion her isses klar, aber vom Inhalt her nicht) liefert und ob der Vergleich klappt.</p>
<p>Nebenbei: Sehe ich das richtig, daß &quot;erg&quot; am ende immer neu gesetzt wird, also beim return im besten Fall nur der Inhalt der letzten message steht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908558</guid><dc:creator><![CDATA[el Clio]]></dc:creator><pubDate>Fri, 04 Nov 2005 23:04:22 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Sat, 05 Nov 2005 12:36:50 GMT]]></title><description><![CDATA[<p>el Clio schrieb:</p>
<blockquote>
<p>junix schrieb:</p>
<blockquote>
<p>el Clio schrieb:</p>
<blockquote>
<ol>
<li></li>
</ol>
<p>Sofern die Queue eine Klasse der Standard Template Libary ist, ist die definitiv Threadsicher!<br />
CriticalSections, Semaphoren etc. sind da überflüssig!</p>
</blockquote>
<p>Quelle?</p>
</blockquote>
<p>Weiß nicht mehr ganz genau, meine aber STL doku.</p>
</blockquote>
<p>...konnte aber keinen Hinweis auf Threadsicherheit finden in der BCB-Dokumentation... und es wäre auch unlogisch, Threadsicherheit standardmässig einzubinden. Es gibt allerdings z.B. TThreadLIst die Threadsicher sein soll... Auf jeden Fall gilt im Zweifel immer die deffensivere Annahme zu treffen. Das schlechteste was dir da passieren kann ist, dass du doppelte Threadsicherheit implementierst. Birgt aber weniger Nachteile als keine Threadsicherheit...</p>
<p>el Clio schrieb:</p>
<blockquote>
<p>junix schrieb:</p>
<blockquote>
<p>el Clio schrieb:</p>
<blockquote>
<ol start="2">
<li></li>
</ol>
<p>Dann wirkt manchmal statt nur &quot;Sleep()&quot; sowas hier Wunder:</p>
<pre><code class="language-cpp">...
Sleep(500);
Application-&gt;ProcessMessages();
...
</code></pre>
</blockquote>
<p>Wieso?</p>
</blockquote>
<p>Pure Erfahrung. Grade bei dem vcl-Thread-Zeugs ist ein abarbeiten der der Nachrichten ab und an mal sinnvoll.</p>
</blockquote>
<p>... denn sie wissen nicht was sie tun ...</p>
<p>Auch beim VCL zeugs ist ein neuer Thread ein neuer Thread der ein neuer Thread ist. Da braucht es keine Abarbeitung von Nachrichten, ausser der Thread verwendet z.B. wieder ein Control auf einem Formular. Dann ists aber ohnehin müssig, irgendwas in einen Thread zu verlagern.</p>
<p>el Clio schrieb:</p>
<blockquote>
<p>Hatte auch schon mal ein ähnliches Problem, daß ich was losgeschickt habe, mit Sleep(), also blockierend gewartet habe und dann die Antwort abfragen wollte. Ergebnis: Mal gings, mal nicht.<br />
Durch Application-&gt;ProcessMessages(), also durch schäbiges pollen gings dann wie von Zauberhand.</p>
</blockquote>
<p>Unter verwendung eines COntrols das über die Nachrichtenschleife der Applikation geht, gluab ich das sofort...</p>
<p>el Clio schrieb:</p>
<blockquote>
<p>junix schrieb:</p>
<blockquote>
<blockquote>
<p>Noch als kleiner Gedankengang für mich: Warum gibst du eigentlich nicht einfach einen Zeiger auf deine Queue zurück statt ner Kopie?</p>
</blockquote>
<p>Weil die Queue änderungen unterworfen ist, und man ja nicht immer den Thread wieder unterbrechen will mit kurzen zugriffen? Man sollte nie Zeiger auf klasseninterne Datenstrukturen zurückliefern. Das gefährdet die Integrität</p>
</blockquote>
<p>Ja, ok! Hab nix gesagt! Je nach größe der Queue und je nach Größe der vorhandenen recourcen ist es aber manchmal sinnvoller die integrität zu gefährden, dafür aber auf die ewigen kopierereien zu verzichten. So dachte ich eigentlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":-P"
      alt="😛"
    /></p>
</blockquote>
<p>... Auch nicht falsch. Ich allerdings gehe dabei meist dazu über, das ich Datagramme einzeln aus besagtem Puffer hole und sie verarbeite. Das verhindert mir auch merkürdige Stacking-Effekte bei der Kommunikation...</p>
<p>[/quote]Nebenbei: Sehe ich das richtig, daß &quot;erg&quot; am ende immer neu gesetzt wird, also beim return im besten Fall nur der Inhalt der letzten message steht?[/quote]Wo siehst du denn sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/908723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908723</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Sat, 05 Nov 2005 12:36:50 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Sat, 05 Nov 2005 18:29:31 GMT]]></title><description><![CDATA[<p>junix schrieb:</p>
<blockquote>
<p>el Clio schrieb:</p>
<blockquote>
<p>Nebenbei: Sehe ich das richtig, daß &quot;erg&quot; am ende immer neu gesetzt wird, also beim return im besten Fall nur der Inhalt der letzten message steht?</p>
</blockquote>
<p>Wo siehst du denn sowas?</p>
</blockquote>
<p>Bei</p>
<pre><code class="language-cpp">erg = temp.SubString(header.Length() + 3, length * 2);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/908958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/908958</guid><dc:creator><![CDATA[el Clio]]></dc:creator><pubDate>Sat, 05 Nov 2005 18:29:31 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Sun, 06 Nov 2005 00:56:25 GMT]]></title><description><![CDATA[<p>Nur dann, wennauch Nachrichten in der Queue waren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/909192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/909192</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Sun, 06 Nov 2005 00:56:25 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Sun, 06 Nov 2005 13:35:17 GMT]]></title><description><![CDATA[<p>junix schrieb:</p>
<blockquote>
<p>Nur dann, wennauch Nachrichten in der Queue waren...</p>
</blockquote>
<p>Ja eben! Und für jede Nachricht neu. Also steht entweder &quot;nix&quot; drin oder eben das Ergebnis aus dem temp.SubString(), wobei in temp doch die letzte Nachricht enthält.</p>
<p>Irgendwie erschließt sich mir grad der Sinn nicht wirklich!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/909463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/909463</guid><dc:creator><![CDATA[el Clio]]></dc:creator><pubDate>Sun, 06 Nov 2005 13:35:17 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Sun, 06 Nov 2005 18:07:16 GMT]]></title><description><![CDATA[<p>Er will entweder die Nachricht oder &quot;nix&quot; drinne stehen haben. Wenn er jetzt die Datagramme überprüft wird das Ergbenis zunächst mit &quot;nix&quot; initialisiert. Geht dann aber alle datagramme durch. Wenn er den header findet, weist er diesen dem Ergebnis zu. Ansonsten kommt nix zurück.?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/909783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/909783</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Sun, 06 Nov 2005 18:07:16 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Mon, 07 Nov 2005 07:13:20 GMT]]></title><description><![CDATA[<p>junix schrieb:</p>
<blockquote>
<p>Er will entweder die Nachricht oder &quot;nix&quot; drinne stehen haben. Wenn er jetzt die Datagramme überprüft wird das Ergbenis zunächst mit &quot;nix&quot; initialisiert. Geht dann aber alle datagramme durch. Wenn er den header findet, weist er diesen dem Ergebnis zu. Ansonsten kommt nix zurück.?</p>
</blockquote>
<p>Und wenn mehrere Header drin sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/910227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/910227</guid><dc:creator><![CDATA[el Clio]]></dc:creator><pubDate>Mon, 07 Nov 2005 07:13:20 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Mon, 07 Nov 2005 08:10:17 GMT]]></title><description><![CDATA[<p>Dann scheint ihn offensichtlich nur der letzte Header zu interessieren... Nicht sauber aber machbar...?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/910268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/910268</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Mon, 07 Nov 2005 08:10:17 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Wed, 09 Nov 2005 15:31:07 GMT]]></title><description><![CDATA[<p>So, jetzt muss ich mich auch mal wieder zu Wort melden:</p>
<p>Ich habe mal ein</p>
<pre><code class="language-cpp">Application-&gt;ProcessMessages();
</code></pre>
<p>eingebaut, und siehe da, es wirkt tatsächlich Wunder! Auch wenn ich keine Ahnung habe warum...</p>
<p>Ich werde aber trotzdem den Tipp von junix realisieren, und eine threadsichere Klasse von der Queue ableiten. Schon allein wegen des Lerneffektes.</p>
<p>Vielen Dank erst mal</p>
<p>Winzler</p>
]]></description><link>https://www.c-plusplus.net/forum/post/912868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/912868</guid><dc:creator><![CDATA[Winzler]]></dc:creator><pubDate>Wed, 09 Nov 2005 15:31:07 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Thu, 10 Nov 2005 06:26:57 GMT]]></title><description><![CDATA[<p>Winzler schrieb:</p>
<blockquote>
<p>und siehe da, es wirkt tatsächlich Wunder!</p>
</blockquote>
<p>Na sag ich ja! <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/913523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/913523</guid><dc:creator><![CDATA[el Clio]]></dc:creator><pubDate>Thu, 10 Nov 2005 06:26:57 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Fri, 11 Nov 2005 10:33:14 GMT]]></title><description><![CDATA[<p>Jetzt habe ich versucht, eine threadsichere Queue zu erstellen.</p>
<p>So sieht die Definition aus:</p>
<pre><code class="language-cpp">class MessageQueue : private deque&lt;MostMessage&gt;
{
private:
        TCriticalSection* Sperre;
public:
        MessageQueue(void);
        void push(MostMessage);
        MostMessage at(int i);
        void clear(void);
        int size(void);
        MessageQueue get(void);
};
</code></pre>
<p>Und so die Implementierung:</p>
<pre><code class="language-cpp">MessageQueue::MessageQueue(void)
{
   Sperre = new TCriticalSection;
}

void MessageQueue::push(MostMessage message)
{
   Sperre-&gt;Acquire();
   push_back(message);
   Sperre-&gt;Release();
}

MostMessage MessageQueue::at(int i)
{
   Sperre-&gt;Acquire();
   MostMessage erg = deque&lt;MostMessage&gt;::at(i);
   Sperre-&gt;Release();
   return erg;
}

MessageQueue MessageQueue::get(void)
{
   Sperre-&gt;Acquire();
   MessageQueue erg;
   erg = *this;
   Sperre-&gt;Release();
   return erg;
}

void MessageQueue::clear(void)
{
   Sperre-&gt;Acquire();
   deque&lt;MostMessage&gt;::clear();
   Sperre-&gt;Release();
}

int MessageQueue::size(void)
{
   int erg;
   Sperre-&gt;Acquire();
   erg = deque&lt;MostMessage&gt;::size();
   Sperre-&gt;Release();
   return erg;
}
</code></pre>
<p>Die so erstellte Queue zeigt allerdings nicht die gewünschte Wirkung. Ich habe auch schon versucht, TCriticalSection *Sperre global zu machen, also quasi so:</p>
<pre><code class="language-cpp">TCriticalSection *s;    //globale Variable

MessageQueue::MessageQueue(void)
{
   Sperre = s;
}
</code></pre>
<p>Dann krieg ich folgende Warnung...</p>
<p>[Linker Warnung] Public symbol '_s' defined in both module C:\PROGRAMME\CBUILDER6\PROJECTS\DLLCALL.OBJ and C:\PROGRAMME\CBUILDER6\PROJECTS\MOST.OBJ</p>
<p>...und lauter Exceptions wenn ich mein Programm aufrufe.</p>
<p>Kann mir einer sagen, was ich da falsch mache? Wäre es möglich, die TCriticalSection <strong>static</strong> zu machen, damit sie für alle MessageQueues gilt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/914828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/914828</guid><dc:creator><![CDATA[Winzler]]></dc:creator><pubDate>Fri, 11 Nov 2005 10:33:14 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Fri, 11 Nov 2005 10:37:22 GMT]]></title><description><![CDATA[<p>Wozu brauchst du die Sperre Public machen? Sie dient ja nur dazu, deine klassen-Internen Ressourcen zu schützen.</p>
<p>Es reicht also völlig, die Sperre als privates Klassenelement zu implementieren. Die Einzigen die Aquire und Release aufrufen sind ja die Funktionen die auf die klasseninterne Liste zugreifen?</p>
<p>Was heisst &quot;zeigt nicht die gewünschte Wirkung&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/914829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/914829</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Fri, 11 Nov 2005 10:37:22 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Fri, 11 Nov 2005 10:39:17 GMT]]></title><description><![CDATA[<p>Hast du im Übrigen irgendwelche Schleifenbildungen in deiner Hauptanwendung? Wie sieht die CPU-belastung aus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/914836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/914836</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Fri, 11 Nov 2005 10:39:17 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Fri, 11 Nov 2005 12:45:38 GMT]]></title><description><![CDATA[<p>&quot;Nicht die gewünschte Wirkung&quot; heisst, dass ich wieder Nachrichten in der Queue vermisse, die definitiv bereits empfangen wurden und die kurz darauf auch plötzlich da sind.</p>
<p>In meiner Hauptanwendung gibts keine Schleifen. Meine Hauptanwendung ist lediglich ein Fenster mit Buttons, mit denen verschiedene Nachrichten verschickt werden können, deren Antwort dann ausgewertet wird.</p>
<p>Die CPU-Belastung schwankt so zwischen 5 und 10 Prozent.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915021</guid><dc:creator><![CDATA[Winzler]]></dc:creator><pubDate>Fri, 11 Nov 2005 12:45:38 GMT</pubDate></item><item><title><![CDATA[Reply to Datenübergabe zwischen zwei Threads on Fri, 11 Nov 2005 15:40:46 GMT]]></title><description><![CDATA[<p>Wartet die Hauptanwendung auf irgendwas? Z.b. die Antwort?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915275</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Fri, 11 Nov 2005 15:40:46 GMT</pubDate></item></channel></rss>