<?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[wie organisiere ich meine Threads beim Empfang von Telegramen vom Feldbus]]></title><description><![CDATA[<p>Hallo alle,</p>
<p>wir planen ein Modul in unserer Software neu zu designen, welches für den Empfang von <a href="http://de.wikipedia.org/wiki/Controller_Area_Network" rel="nofollow">CAN</a>-Telegrammen zuständig ist. Die Telegramme kommen mit einer Frequenz von bis zu 3000 pro Sekunde rein (meistens ca. 1000 1/s). Die Größe eines Telegramms ist vernachlässigbar klein.<br />
Es sind ca. 80 Objekte in unserer Applikation, die eines dieser Telegramme empfangen. Es gibt auch Telegramme, die an mehr als ein Objekt addressiert sind.</p>
<p>Aus Gründen der verwendeten Treiber brauchen wir mindesten einen Thread pro Kanal, wobei es zwei oder vier Kanäle geben kann. Aus diesem Thread heraus wird eine blockierende Funktion aufgerufen, die auf ein Telegramm wartet. Bisher hatte jedes der Objekte seinen eigenen Emfangs-Thread, was ein paar Nachteile hat.<br />
Das ganze läuft geschrieben in C++ unter Windows 7 meistens auf Quad-Core-PCs. boost.thread verwenden wir schon, boost.asio wäre eine Option.</p>
<p>Ich habe zwei grundsätzlich verschiedene Ideen, wie ich die Threads in der Applikation organisiere; bevor ich das hier breit trete, Frage an Euch:<br />
wie organisiert man in so einer Anwendung die Threads 'am besten'?</p>
<p>Die selbe Frage habe ich auf Stackoverflow gestellt: <a href="http://stackoverflow.com/questions/27543946/receiving-messages-with-high-frequence-asking-for-the-best-thread-model" rel="nofollow">http://stackoverflow.com/questions/27543946/receiving-messages-with-high-frequence-asking-for-the-best-thread-model</a></p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330016/wie-organisiere-ich-meine-threads-beim-empfang-von-telegramen-vom-feldbus</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 15:37:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330016.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 18 Dec 2014 11:25:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to wie organisiere ich meine Threads beim Empfang von Telegramen vom Feldbus on Thu, 18 Dec 2014 11:25:51 GMT]]></title><description><![CDATA[<p>Hallo alle,</p>
<p>wir planen ein Modul in unserer Software neu zu designen, welches für den Empfang von <a href="http://de.wikipedia.org/wiki/Controller_Area_Network" rel="nofollow">CAN</a>-Telegrammen zuständig ist. Die Telegramme kommen mit einer Frequenz von bis zu 3000 pro Sekunde rein (meistens ca. 1000 1/s). Die Größe eines Telegramms ist vernachlässigbar klein.<br />
Es sind ca. 80 Objekte in unserer Applikation, die eines dieser Telegramme empfangen. Es gibt auch Telegramme, die an mehr als ein Objekt addressiert sind.</p>
<p>Aus Gründen der verwendeten Treiber brauchen wir mindesten einen Thread pro Kanal, wobei es zwei oder vier Kanäle geben kann. Aus diesem Thread heraus wird eine blockierende Funktion aufgerufen, die auf ein Telegramm wartet. Bisher hatte jedes der Objekte seinen eigenen Emfangs-Thread, was ein paar Nachteile hat.<br />
Das ganze läuft geschrieben in C++ unter Windows 7 meistens auf Quad-Core-PCs. boost.thread verwenden wir schon, boost.asio wäre eine Option.</p>
<p>Ich habe zwei grundsätzlich verschiedene Ideen, wie ich die Threads in der Applikation organisiere; bevor ich das hier breit trete, Frage an Euch:<br />
wie organisiert man in so einer Anwendung die Threads 'am besten'?</p>
<p>Die selbe Frage habe ich auf Stackoverflow gestellt: <a href="http://stackoverflow.com/questions/27543946/receiving-messages-with-high-frequence-asking-for-the-best-thread-model" rel="nofollow">http://stackoverflow.com/questions/27543946/receiving-messages-with-high-frequence-asking-for-the-best-thread-model</a></p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433484</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 18 Dec 2014 11:25:51 GMT</pubDate></item><item><title><![CDATA[Reply to wie organisiere ich meine Threads beim Empfang von Telegramen vom Feldbus on Thu, 18 Dec 2014 12:08:16 GMT]]></title><description><![CDATA[<p>IMHO sollte man threads nach Möglichkeit gar nicht selbst verwalten. Ich finde den Ansatz von <a href="https://www.threadingbuildingblocks.org/" rel="nofollow">https://www.threadingbuildingblocks.org/</a> interessant. Für deinen Zweck könnte der Flow Graph nützlich sein.<br />
Ich arbeite mich allerdings auch erst in TBB ein, daher habe ich bisher leider kaum Erfahrung damit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433487</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 18 Dec 2014 12:08:16 GMT</pubDate></item><item><title><![CDATA[Reply to wie organisiere ich meine Threads beim Empfang von Telegramen vom Feldbus on Thu, 18 Dec 2014 23:01:38 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Aus Gründen der verwendeten Treiber brauchen wir mindesten einen Thread pro Kanal, wobei es zwei oder vier Kanäle geben kann.</p>
</blockquote>
<p>Dann würde ich das vermutlich genau so machen, also ein Thread pro Kanal.</p>
<p>Und dann kommts auf die Anforderungen der Anwendung drauf an. Es kann Sinn machen die Telegramme gleich synchron im Empfangs-Thread zu verarbeiten. Es kann Sinn machen sie über eine Producer-Consumer Queue an einen einzigen &quot;verarbeite alles&quot; Thread weiterzugeben.<br />
Oder an mehrere Threads die verarbeiten, z.B. einen pro Objekt.</p>
<p>Kommt halt drauf an. z.B. darauf wie lange so einer Verarbeitung dauern kann, ob es wichtig ist dass so schnell wie möglich wieder die Empfangs-Funktion des Treibers aufgerufen wird, trotz dem die davor empfangenen Telegramme vielleicht noch gar nicht fertig verarbeitet wurden etc. Ob andere blockierende Funktionen aufgerufen werden müssen um die Nachrichten zu verarbeiten.</p>
<p>Bzw. bei Messages die an mehrere Objekte geschickt werden - muss da sichergestellt sein dass Objekt A erst mit der Verarbeitung von Nachricht 2 anfangen darf, nachdem sichergestellt ist dass Objekt A und B beide Nachricht 1 vollständig abgearbeitet haben.</p>
<p>Und natürlich die Frage wie viel der &quot;Arbeit&quot; daraus besteht mit &quot;shared state&quot; rumzumachen - also wie oft bzw. wie lange man zum Bearbeiten einer Nachricht &quot;in&quot; einem Objekt eine globale Mutex locken müsste.</p>
<p>Grundsätzlich kann die Empfangs-Schleife aber vermutlich einfach so aussehen (plus Error-Handling, Shutdown-Handling etc. natürlich):</p>
<pre><code class="language-cpp">for (;;)
    {
        auto tel = m_device.ReceiveTelegram();
        m_dispatcher.Push(tel);
    }
</code></pre>
<p>Wie's weiter geht ist dem Programmteil dann egal, das ist dann die Aufgabe des Dispatchers.<br />
Also ob der die Verarbeitung direkt synchron in Push macht, eine gemeinsame Producer-Consumer Queue verwendet, eine Producer-Consumer Queue pro &quot;Empfänger&quot; usw.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433562</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 18 Dec 2014 23:01:38 GMT</pubDate></item><item><title><![CDATA[Reply to wie organisiere ich meine Threads beim Empfang von Telegramen vom Feldbus on Fri, 19 Dec 2014 11:18:36 GMT]]></title><description><![CDATA[<blockquote>
<p>Aus Gründen der verwendeten Treiber brauchen wir mindesten einen Thread pro &gt;Kanal, wobei es zwei oder vier Kanäle geben kann.</p>
</blockquote>
<p>d.h. dein treiber hat nur blockierende funktionen? ganz ganz sicher?</p>
<blockquote>
<p>Aus diesem Thread heraus wird eine blockierende<br />
Funktion aufgerufen, die auf ein Telegramm wartet.</p>
</blockquote>
<p>warum blockiert die? wenn du die Raten nicht schaffst bringt dir<br />
ein absichern doch auch nichts mehr - oder?</p>
<p>oder meinst du n Threads auf 1 blockierende</p>
<blockquote>
<p>Bisher hatte jedes der Objekte seinen eigenen Emfangs-Thread, was ein paar &gt;Nachteile hat.</p>
</blockquote>
<p>wir brauchen mehr Details zu den &quot;logischen&quot; CAN-Inhalten - sonst versteht hier keiner woviele Objekte/Threads auf wieviel warten</p>
<p>nur empfangen - oder auch permantent/sporadisch senden?</p>
<blockquote>
<p>boost.asio wäre eine Option.</p>
</blockquote>
<p>wofür asio?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433613</guid><dc:creator><![CDATA[Gast3]]></dc:creator><pubDate>Fri, 19 Dec 2014 11:18:36 GMT</pubDate></item><item><title><![CDATA[Reply to wie organisiere ich meine Threads beim Empfang von Telegramen vom Feldbus on Fri, 19 Dec 2014 11:20:09 GMT]]></title><description><![CDATA[<blockquote>
<p>Die selbe Frage habe ich auf Stackoverflow gestellt</p>
</blockquote>
<p>auf stackoverflow steht ein paar mehr Details - so viel zu &quot;Die selbe&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433614</guid><dc:creator><![CDATA[Gast3]]></dc:creator><pubDate>Fri, 19 Dec 2014 11:20:09 GMT</pubDate></item><item><title><![CDATA[Reply to wie organisiere ich meine Threads beim Empfang von Telegramen vom Feldbus on Fri, 19 Dec 2014 12:49:22 GMT]]></title><description><![CDATA[<blockquote>
<p>Die Größe eines Telegramms ist vernachlässigbar klein.<br />
Es sind ca. 80 Objekte in unserer Applikation,<br />
die eines dieser Telegramme empfangen. Es gibt auch Telegramme, die an mehr als &gt;ein Objekt addressiert sind.</p>
</blockquote>
<p>Tip 1:</p>
<p>d.h. du kannst problemlos mit einem statische Puffer arbeiten<br />
z.B. einem Ringpuffer - keine Allokation = mehr Durchsatz = mehr Zeit fuer andere Dinge</p>
<p>und dann die Pakete per Referenz (ohne Allok und Copy) aus dem Ringpuffer zur Bearbeitung an die Objekte verteilen</p>
<p>oder geht aus ungenannten Gründen nicht?</p>
<p>Tip 2:</p>
<p>wie werde die Pakete den Objekten zugeordnet - per Id oder sowas? da auch unbeding auf die Performanz achten - einen sortierten std::vector mit den Id+Objekt-Ptr koennte bei der Menge viel schneller sein als per std::(unordered)map an den Objekt-Pointer zu kommen</p>
<p>vernachlässige auch nicht die Anzahl an trivial virtuellen-Methoden aufrufen (und deren Dauer) - Falls das relevant ist</p>
<p>Tip 3:</p>
<p>wenn die Objekte keinen eigenen Kontext brauchen - oder der abgetrennt nur fuer andere Sachen da ist würde ich darauf verzichten die Objekte mit Qeues auszustatten</p>
<p>- oder brauchst du Empfangs-Queues?</p>
<p>wie gesagt: zu wenig Infos für eine gute Beurteilung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433622</guid><dc:creator><![CDATA[Gast3]]></dc:creator><pubDate>Fri, 19 Dec 2014 12:49:22 GMT</pubDate></item><item><title><![CDATA[Reply to wie organisiere ich meine Threads beim Empfang von Telegramen vom Feldbus on Fri, 19 Dec 2014 13:38:02 GMT]]></title><description><![CDATA[<p>Tip4:</p>
<p>und du solltest dir eine Möglichkeit überlegen wie du den Durchsatz (ohne Mallocs usw) messbar machst - es wäre sicher auf Dauer (per #define aktivierbar) schön zu wissen ob noch viel Luft da ist oder ob der Durchsatz so knapp gehalten wird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433634</guid><dc:creator><![CDATA[Gast3]]></dc:creator><pubDate>Fri, 19 Dec 2014 13:38:02 GMT</pubDate></item><item><title><![CDATA[Reply to wie organisiere ich meine Threads beim Empfang von Telegramen vom Feldbus on Fri, 19 Dec 2014 15:06:53 GMT]]></title><description><![CDATA[<blockquote>
<p>Die Telegramme kommen mit einer Frequenz von bis zu 3000 pro Sekunde rein (meistens ca. 1000 1/s). Die Größe eines Telegramms ist vernachlässigbar klein.</p>
</blockquote>
<p>Gibt es eigentlich einen Treiber für den CAN Bus, welcher ähnlich dem seriellen Port, die Daten empfängt und in einen Puffer steckt? Und wie groß ist der Puffer?</p>
<p>Und wieviel Datendurchsatz ist zu erwarten? Kann ich davon ausgehen dass jeder Kanal sagen wir mal 4 kByte Daten alle 5 Minuten liefert? Läuft der Puffer des Treibers voll?</p>
<p>3000 Pakete pro Sekunde ist eine echt stramme Angelegenheit. Und wenn das Ding mehrere Megabyte alle 2 Minuten sendet, hast du ein Problem.</p>
<p>Stell dir mal vor es kommt ein Burst von 6000 Paketen rein. Jedes Paket belegt 4 Bytes, macht zusammen 24000 Bytes. Danach ist 50ms Ruhe, worauf wieder so ein Burst reinkommt. -&gt; Deine Empfangsfunktion muss 24000Byte alle 50ms verarbeiten. Und dann kommt Windows, will den Suchindex und Virenscanner aktualisieren und verbrät mal 1 Sekunde, s.d. in der Zwischenzeit dein Empfangspuffer überläuft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433650</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Fri, 19 Dec 2014 15:06:53 GMT</pubDate></item></channel></rss>