<?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[Threading Problem]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem das wie folgt aussieht:</p>
<p>Ich habe in der main() eine Hauptschleife, in der Nachrichten verarbeitet werden. Der Aufruf der recv() Funktion lässt das Programm an dieser Stelle warten (Blocking). Aus diesem Grund habe ich einen Thread gestartet, der alle 20 Minuten eine Nachricht versendet und dann die Antwort empfangen und auswerten soll. Doch ich habe dabei das Problem, dass die Nachricht (meistens) nicht in meinem gestarteten Thread empfangen wird, sondern in der main(). Das ist von mir natürlich nicht so gewollt.</p>
<p>Es handelt sich bei der recv() und send() Funktion um Socketfunktionen.</p>
<p>Mein Problem würde in <strong>Pseudo-Code</strong> in etwa so aussehen:</p>
<pre><code class="language-cpp">// ...

int main()
{
  startThread(Thread());
  while (true)
  {
    recv(...); // Auf Nachricht warten

    // Do something...
  }
}

int Thread()
{
  while (true)
  {
    if (TimePassed()) // Wenn die 20 Minuten vergangen sind
    {
      send();
      recv(); // Hier soll die Antwort abgefangen werden, aber meistens geschieht dies schon in der main()...

      // Do something...
    }
  }
  Sleep(1000); // Thread entlasten, da er z.Z. sowieso warten muss.
}
</code></pre>
<p>Ich hatte erst die Idee nach Ablauf der Zeit ein bool auf true zu setzen, und anschließend in der main() weiter zu machen. Allerdings wartet recv() ja dort noch immer. Aus diesem Grund muss mindestens der Sendevorgang im Thread ausgeführt werden. Ich habe auch versucht den Main Thread mit SuspendThread für den Zeitraum des Sendens und Empfangens anzuhalten, aber das scheint nicht zu funktionieren, da der Main Thread noch immer aktiv war.</p>
<p>Wie kriege ich das jetzt am Besten in den Griff? Habt ihr Ideen?</p>
<p>Vielen Dank,<br />
MrThread</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/224849/threading-problem</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 18:17:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/224849.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Oct 2008 19:18:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Threading Problem on Wed, 15 Oct 2008 19:18:45 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem das wie folgt aussieht:</p>
<p>Ich habe in der main() eine Hauptschleife, in der Nachrichten verarbeitet werden. Der Aufruf der recv() Funktion lässt das Programm an dieser Stelle warten (Blocking). Aus diesem Grund habe ich einen Thread gestartet, der alle 20 Minuten eine Nachricht versendet und dann die Antwort empfangen und auswerten soll. Doch ich habe dabei das Problem, dass die Nachricht (meistens) nicht in meinem gestarteten Thread empfangen wird, sondern in der main(). Das ist von mir natürlich nicht so gewollt.</p>
<p>Es handelt sich bei der recv() und send() Funktion um Socketfunktionen.</p>
<p>Mein Problem würde in <strong>Pseudo-Code</strong> in etwa so aussehen:</p>
<pre><code class="language-cpp">// ...

int main()
{
  startThread(Thread());
  while (true)
  {
    recv(...); // Auf Nachricht warten

    // Do something...
  }
}

int Thread()
{
  while (true)
  {
    if (TimePassed()) // Wenn die 20 Minuten vergangen sind
    {
      send();
      recv(); // Hier soll die Antwort abgefangen werden, aber meistens geschieht dies schon in der main()...

      // Do something...
    }
  }
  Sleep(1000); // Thread entlasten, da er z.Z. sowieso warten muss.
}
</code></pre>
<p>Ich hatte erst die Idee nach Ablauf der Zeit ein bool auf true zu setzen, und anschließend in der main() weiter zu machen. Allerdings wartet recv() ja dort noch immer. Aus diesem Grund muss mindestens der Sendevorgang im Thread ausgeführt werden. Ich habe auch versucht den Main Thread mit SuspendThread für den Zeitraum des Sendens und Empfangens anzuhalten, aber das scheint nicht zu funktionieren, da der Main Thread noch immer aktiv war.</p>
<p>Wie kriege ich das jetzt am Besten in den Griff? Habt ihr Ideen?</p>
<p>Vielen Dank,<br />
MrThread</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599601</guid><dc:creator><![CDATA[MrThread]]></dc:creator><pubDate>Wed, 15 Oct 2008 19:18:45 GMT</pubDate></item><item><title><![CDATA[Reply to Threading Problem on Wed, 15 Oct 2008 19:44:50 GMT]]></title><description><![CDATA[<p>da stimmt doch was grundsätzlich nicht, 2 threads die auf dem gleichen socket recv machen, was soll das bringen? mach das doch mal besser sonst...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599608</guid><dc:creator><![CDATA[madstyler]]></dc:creator><pubDate>Wed, 15 Oct 2008 19:44:50 GMT</pubDate></item><item><title><![CDATA[Reply to Threading Problem on Wed, 15 Oct 2008 20:41:37 GMT]]></title><description><![CDATA[<p>madstyler schrieb:</p>
<blockquote>
<p>da stimmt doch was grundsätzlich nicht, 2 threads die auf dem gleichen socket recv machen, was soll das bringen? mach das doch mal besser sonst...</p>
</blockquote>
<p>Das Programm wird gestartet und geht in die Hauptschleife. Dort werden die Nachrichten empfangen und bearbeitet. Alle 20 Minuten möchte ich jedoch eine spezielle Nachricht senden und auch die dazugehörige Antwort empfangen. Durch das Blocken von recv() in der Hauptschleife kann ich allerdings dort nicht zuverlässig abfragen, ob die 20 Minuten bereits um sind, da ja auch 30 Minuten gar keine Nachricht mehr kommen könnte. Daher habe ich das in einem neuen Thread ausgelagert. Wenn die 20 Minuten also um sind, dann sendet mein Programm die Nachricht. Bis hierhin klappt alles perfekt. Nun sendet die Gegenseite eine Antwort. Mein Programm erhält die Nachricht, aber die wird jetzt in main() und nicht im Thread empfangen. Allerdings würde ich sie gerne im Thread empfangen, um sie dort dann auch verarbeiten zu können. Wenn ich viele Nachrichten hinteinander sende, dann kann es auch mal sein, dass auch im Thread mal eine ankommt, aber das ist ja keine Lösung...</p>
<p>Ich hoffe, mein Probem ist jetzt noch klarer geworden.</p>
<p>Würde mich über Hilfe sehr freuen <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>
<p>Vielen Dank,<br />
MrThread</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599637</guid><dc:creator><![CDATA[MrThread]]></dc:creator><pubDate>Wed, 15 Oct 2008 20:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to Threading Problem on Wed, 15 Oct 2008 22:50:15 GMT]]></title><description><![CDATA[<p>Verwende select und/oder non-blocking sockets.<br />
Dann brauchst du auch keinen zweiten Thread dafür.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599674</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 15 Oct 2008 22:50:15 GMT</pubDate></item><item><title><![CDATA[Reply to Threading Problem on Thu, 16 Oct 2008 16:00:33 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für die für mich sehr hilfreichen Antworten. Ich übergebe nun an select() folgende Struktur:</p>
<pre><code class="language-cpp">timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 100;
</code></pre>
<p>Es funktioniert alles sehr gut, aber haltet ihr diese Lösung für in Ordnung? <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>
<p>Viele Grüße,<br />
MrSelect alias MrThread</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600021</guid><dc:creator><![CDATA[MrSelect]]></dc:creator><pubDate>Thu, 16 Oct 2008 16:00:33 GMT</pubDate></item></channel></rss>