<?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[boost.test mit blockierender Funktion]]></title><description><![CDATA[<p>Wir benutzten für unsere Unit-Tests <a href="http://www.boost.org/doc/libs/1_35_0/libs/test/doc/index.html" rel="nofollow">boost.test</a> und haben neuerdings die Anforderung, eine blockierende Funktion zu detektieren.<br />
Also es gibt eine Funktion oder besser einen Funktor</p>
<pre><code class="language-cpp">struct Blocky
{
    void operator()()
    {
        // hier steht unser Code, der im Fehlerfall blockiert
        // genau genommen handelt es sich um das Einlesen von einem Device, welches blockiert, wenn keine Daten mehr kommen
    }
};
</code></pre>
<p>der Teil unserer Testumgebung ist. In einem Testcase wird dies dann benutzt</p>
<pre><code class="language-cpp">BOOST_AUTO_TEST_CASE( unserTest )
{
    // .. irgendwas
    Blocky b;
    BOOST_TEST_WEISS_NICH_WAS( b, 2 /*sec*/ ); // hier sollte dann b() aufgerufen werden, und wenn das nach 2s nicht fertig ist, dann FEHLER.
}
</code></pre>
<p>Ich habe schon einiges probiert, was aber nicht funktioniert hat.<br />
Kennt sich jemand damit aus, und kann mir sagen wie man das richtig macht?<br />
Bem.: wir nutzen z.Zt. boost Version 1.35 - würden aber auch updaten, wenn nötig.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261920/boost-test-mit-blockierender-funktion</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 00:40:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261920.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Feb 2010 14:27:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost.test mit blockierender Funktion on Thu, 25 Feb 2010 14:27:25 GMT]]></title><description><![CDATA[<p>Wir benutzten für unsere Unit-Tests <a href="http://www.boost.org/doc/libs/1_35_0/libs/test/doc/index.html" rel="nofollow">boost.test</a> und haben neuerdings die Anforderung, eine blockierende Funktion zu detektieren.<br />
Also es gibt eine Funktion oder besser einen Funktor</p>
<pre><code class="language-cpp">struct Blocky
{
    void operator()()
    {
        // hier steht unser Code, der im Fehlerfall blockiert
        // genau genommen handelt es sich um das Einlesen von einem Device, welches blockiert, wenn keine Daten mehr kommen
    }
};
</code></pre>
<p>der Teil unserer Testumgebung ist. In einem Testcase wird dies dann benutzt</p>
<pre><code class="language-cpp">BOOST_AUTO_TEST_CASE( unserTest )
{
    // .. irgendwas
    Blocky b;
    BOOST_TEST_WEISS_NICH_WAS( b, 2 /*sec*/ ); // hier sollte dann b() aufgerufen werden, und wenn das nach 2s nicht fertig ist, dann FEHLER.
}
</code></pre>
<p>Ich habe schon einiges probiert, was aber nicht funktioniert hat.<br />
Kennt sich jemand damit aus, und kann mir sagen wie man das richtig macht?<br />
Bem.: wir nutzen z.Zt. boost Version 1.35 - würden aber auch updaten, wenn nötig.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861289</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 25 Feb 2010 14:27:25 GMT</pubDate></item><item><title><![CDATA[Reply to boost.test mit blockierender Funktion on Thu, 25 Feb 2010 15:42:35 GMT]]></title><description><![CDATA[<p>Dazu müsstest du wenn ich das richtig sehe die blockierende Funktion von außerhalb irgendwie abschießen können, sonst wartet der Testcase immer so lange wie die Funktion blockiert. Wenn das tatsächlich in irgendeiner Weise möglich ist (z.B. durch irgendeinen interrupt), würde ein Vorgehen naiv gesehen doch wie folgt aussehen:</p>
<p>- starte einen Thread mit der Funktion b (und stelle sicher dass der genügend CPU-Zeit bekommt)<br />
- warte im main-Thread 2 Sekunden drauf, ob der Thread zurückkommt (boost::timer z.B.), falls nicht, kille ihn und liefere ERROR</p>
<p>Alternativ kannst das auch mit asio oder ähnlichem machen, ist im grunde aber das gleiche.<br />
Wenn du die blockierende Funktion nicht unterbrechen kannst hast du quasi das selbe in grün wie ich mit dem blockierenden Input (anderer Thread).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861354</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 25 Feb 2010 15:42:35 GMT</pubDate></item><item><title><![CDATA[Reply to boost.test mit blockierender Funktion on Thu, 25 Feb 2010 17:00:49 GMT]]></title><description><![CDATA[<p>Danke pumuckl für die Antwort.</p>
<p>Solche Gedanken haben wir natürlich auch - ich suchte nur eine 'schöne' Lösung, die einem solche Kopfstände abnimmt.<br />
Ich habe jetzt auch herausbekommen, dass der <a href="http://www.boost.org/doc/libs/1_41_0/libs/test/doc/html/execution-monitor/user-guide.html" rel="nofollow">boost::execution_monitor</a> das '<em>in der Werbung versprochene</em>' Timeout unter Windows nicht unterstützt. Kaum liest man auch die Dokumentation für die 1.41 schon weiß man warum das mit der 1.35 nicht geht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861398</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 25 Feb 2010 17:00:49 GMT</pubDate></item><item><title><![CDATA[Reply to boost.test mit blockierender Funktion on Thu, 25 Feb 2010 21:20:57 GMT]]></title><description><![CDATA[<p>Die einzige &quot;verschönernde&quot; Änderung die ich hier vorschlagen könnte, wäre, den Thread einfach weiterlaufen zu lassen.</p>
<p>Wenn du es so programmierst, dass der Thread korrekt weiter laufen kann, nachdem die Test-Funktion schon verlassen wurde, dann besteht kein Grund ihn zu killen. (Ich mag Threads killen nicht sonderlich)</p>
<p>Das ist natürlich auch nur dann eine Option, wenn sicher ist, dass die Funktion die in dem Thread ausgeführt wird, andere Tests, die danach kommen, nicht behindern kann. Also z.B. keine globalen Resourcen &quot;verbraucht&quot;, die andere Threads auch brauchen (z.B. Locks, Files oder Devices).</p>
<p>Ansonsten einfach ExitProcess() machen. Ist wohl die &quot;sauberste&quot; Variante.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1861531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1861531</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 25 Feb 2010 21:20:57 GMT</pubDate></item></channel></rss>