<?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[Stream Timeout?]]></title><description><![CDATA[<p>Hi everyone</p>
<p>Ich verwende gerade zum Auslesen eines Gerätes, das an einer RS232-Schnittstelle angeschlossen ist, einen seriellen Stream aus der LibSerial. Das sieht dann in etwa so aus:</p>
<pre><code class="language-cpp">char c;
do {
	stream &gt;&gt; c;
	buffer.append(1, c);
} while (c != ETX);
if (useBCC) {
	stream &gt;&gt; c;
	buffer.append(1, c);
}
</code></pre>
<p>Das klappt soweit wunderbar, es stellt sich mir nur ein Problem: Es kann gut vorkommen, dass das gerät 'mal keine Antwort gibt (sei es nun ausgeschaltet, defekt oder gerade anderwärtig beschäftigt). Gibt es auf meine Anfrage nicht während höchstens 1500ms eine Antwort, ist das eine Protokollverletzung und die Funktion muss abgebrochen werden.</p>
<p>Meine Frage ist nun: Wie kann ich so einen Timeout in C++ realisieren? Muss ich dabei auf Unix-Signalfunktionen zurückgreifen (was ich, wenn möglich, lieber vermeiden würde) oder gibt es da eine allgemeine C++ -Bibliothek für? Ich denke dabei z.B. an eine Timeout-Exception, sodass ich meine Streamanfrage mit einem try-catch schützen könnte...</p>
<p>Besten Dank schon im Voraus für jede Hilfe und beste Grüsse<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/197628/stream-timeout</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 18:09:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197628.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Nov 2007 22:10:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Stream Timeout? on Mon, 12 Nov 2007 22:10:16 GMT]]></title><description><![CDATA[<p>Hi everyone</p>
<p>Ich verwende gerade zum Auslesen eines Gerätes, das an einer RS232-Schnittstelle angeschlossen ist, einen seriellen Stream aus der LibSerial. Das sieht dann in etwa so aus:</p>
<pre><code class="language-cpp">char c;
do {
	stream &gt;&gt; c;
	buffer.append(1, c);
} while (c != ETX);
if (useBCC) {
	stream &gt;&gt; c;
	buffer.append(1, c);
}
</code></pre>
<p>Das klappt soweit wunderbar, es stellt sich mir nur ein Problem: Es kann gut vorkommen, dass das gerät 'mal keine Antwort gibt (sei es nun ausgeschaltet, defekt oder gerade anderwärtig beschäftigt). Gibt es auf meine Anfrage nicht während höchstens 1500ms eine Antwort, ist das eine Protokollverletzung und die Funktion muss abgebrochen werden.</p>
<p>Meine Frage ist nun: Wie kann ich so einen Timeout in C++ realisieren? Muss ich dabei auf Unix-Signalfunktionen zurückgreifen (was ich, wenn möglich, lieber vermeiden würde) oder gibt es da eine allgemeine C++ -Bibliothek für? Ich denke dabei z.B. an eine Timeout-Exception, sodass ich meine Streamanfrage mit einem try-catch schützen könnte...</p>
<p>Besten Dank schon im Voraus für jede Hilfe und beste Grüsse<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402153</guid><dc:creator><![CDATA[KessiMC]]></dc:creator><pubDate>Mon, 12 Nov 2007 22:10:16 GMT</pubDate></item><item><title><![CDATA[Reply to Stream Timeout? on Mon, 12 Nov 2007 22:13:45 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Das must du schon in der Doku deiner Schnittstellen-Library nachschauen. C++ kennt weder serielle Schnittstellen noch Timeouts.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402155</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Mon, 12 Nov 2007 22:13:45 GMT</pubDate></item><item><title><![CDATA[Reply to Stream Timeout? on Mon, 12 Nov 2007 22:48:01 GMT]]></title><description><![CDATA[<p>Hallo Kessi,</p>
<p>der Timeout muss in dem unterliegenden streambuf realisiert werden. Wenn das eine fertige Lib ist, so gibt es sicher eine Möglichkeit das einzustellen. Schlägt der Timeout zu, so wird der streambuf wahrscheinlich ein EOF zurückgeben und der Aufruf</p>
<pre><code class="language-cpp">stream &gt;&gt; c;
</code></pre>
<p>kommt mit Fehler zurück; d.h. der stream steht auf fail; dies musst Du also noch abfragen. Im Prinzip so oder ähnlich</p>
<pre><code class="language-cpp">char c;
do {
    if( stream &gt;&gt; c )
        buffer.append(1, c);
    else {
        // Fehler; evt. Timeout
        break;
    }
} while (c != ETX);
if (useBCC &amp;&amp; stream &gt;&gt; c) {
    buffer.append(1, c);
}
</code></pre>
<p>Was für eine Library zum Auslesen der RS232 benutzt Du?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402169</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 12 Nov 2007 22:48:01 GMT</pubDate></item><item><title><![CDATA[Reply to Stream Timeout? on Thu, 15 Nov 2007 20:04:01 GMT]]></title><description><![CDATA[<p>Das wäre natürlich ideal <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="🙂"
    /> . Leider habe ich Nichts entsprechendes gefunden...</p>
<p>Ich benutze <a href="http://libserial.sourceforge.net/" rel="nofollow">LibSerial</a> .</p>
<p>Greetz<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403969</guid><dc:creator><![CDATA[KessiMC]]></dc:creator><pubDate>Thu, 15 Nov 2007 20:04:01 GMT</pubDate></item><item><title><![CDATA[Reply to Stream Timeout? on Thu, 15 Nov 2007 20:16:47 GMT]]></title><description><![CDATA[<p>Hmm naja so ne dolle Lib scheint es nicht zu sein:</p>
<pre><code class="language-cpp">void LibSerial::SerialStream::Open (const std::string filename, /*...*/)
</code></pre>
<p><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="😃"
    /> Entweder hat doxygen versagt, oder es handelt sich um eine const. kopie von filename. Das ist relativ sinnlos <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="😛"
    /> Man sollte dann schon eine const-Ref übergeben <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/1403977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403977</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Thu, 15 Nov 2007 20:16:47 GMT</pubDate></item><item><title><![CDATA[Reply to Stream Timeout? on Sat, 17 Nov 2007 11:26:55 GMT]]></title><description><![CDATA[<p>Nööö, doxygen hat nicht versagt, das ist effektiv im Code auch so, habe nachgesehen. Naja, mit solchen Kleinigkeiten könnte ich ja noch leben, wenn das Ding einen TimeOut unterstützen würde. Das tut es allerdings, wenn ich das recht sehe, explizit nur wenn man die &quot;SerialPort&quot;-Klasse verwendet anstelle von &quot;SerialStream&quot;.</p>
<p>Diese arbeitet mit Read- bzw. ReadByte-Funktionen, wobei man optional einen TimeOut angeben kann. Umso verdutzter bin ich, dass das bei der Implementation als IOStream nicht gemacht wurde <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> ...</p>
<p>Wenn ich deine Anmerkung richtig verstehe, bist du allerdings ohnehin nicht sehr von dieser Library überzeugt. Kennt denn jemand evtl. Alternativen dazu, mit denen ich einen Stream zum ansteuern der seriellen Schnittstelle verwenden kann?</p>
<p>Alles in allem ist das Ding nämlich recht elegant, muss ich sagen, wenn denn nur ein TimeOut unterstützt würde...</p>
<p>Thx schon 'mal und greeetz<br />
Kessi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1404848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404848</guid><dc:creator><![CDATA[KessiMC]]></dc:creator><pubDate>Sat, 17 Nov 2007 11:26:55 GMT</pubDate></item></channel></rss>