<?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[Aufruf für x Sekunden laufen lassen]]></title><description><![CDATA[<p>Ich habe in C++ eine Methode, die einen synchronen Serveraufruf durchführt.<br />
Dieser Aufruf soll zB 5 Sekunden dauern und danach abgebrochen werden.</p>
<p>Gibt es da eine Möglichkeit dies zu realisieren?<br />
Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289728/aufruf-für-x-sekunden-laufen-lassen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 23:51:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289728.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Jul 2011 18:35:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Aufruf für x Sekunden laufen lassen on Mon, 11 Jul 2011 18:36:02 GMT]]></title><description><![CDATA[<p>Ich habe in C++ eine Methode, die einen synchronen Serveraufruf durchführt.<br />
Dieser Aufruf soll zB 5 Sekunden dauern und danach abgebrochen werden.</p>
<p>Gibt es da eine Möglichkeit dies zu realisieren?<br />
Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091503</guid><dc:creator><![CDATA[c++einsteiger]]></dc:creator><pubDate>Mon, 11 Jul 2011 18:36:02 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf für x Sekunden laufen lassen on Mon, 11 Jul 2011 18:38:22 GMT]]></title><description><![CDATA[<p>Das hat wohl nichts mit Standard-C++ zu tun..<br />
Was nutzt du denn? Windows Sockets? connect()?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091504</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 11 Jul 2011 18:38:22 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf für x Sekunden laufen lassen on Mon, 11 Jul 2011 19:00:50 GMT]]></title><description><![CDATA[<p>Ist ein Corba Aufruf...</p>
<p>Evtl. könnte man den Aufruf ja in einem Thread ausführen, und dieser läuft x Sekunden, wäre das möglich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091517</guid><dc:creator><![CDATA[c++einsteiger]]></dc:creator><pubDate>Mon, 11 Jul 2011 19:00:50 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf für x Sekunden laufen lassen on Mon, 11 Jul 2011 19:07:00 GMT]]></title><description><![CDATA[<p>Welchen ORB benutzt Du? Bei TAO gibt es die Möglichkeit Roundtrip timeout policies zu setzen. Wenn der Aufruf länger als die angegebene timeout Zeit nicht zurück kommt, wird eine Timeout Exception geworfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091525</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Mon, 11 Jul 2011 19:07:00 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf für x Sekunden laufen lassen on Mon, 11 Jul 2011 19:10:46 GMT]]></title><description><![CDATA[<p>Das ist egal...es muss nicht ausführbar sein, sondern soll schematisch angedeutet werden!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091527</guid><dc:creator><![CDATA[c++einsteiger]]></dc:creator><pubDate>Mon, 11 Jul 2011 19:10:46 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf für x Sekunden laufen lassen on Mon, 11 Jul 2011 19:36:11 GMT]]></title><description><![CDATA[<p>Was willst Du erreichen? Du kannst auch sleep(5000) schreiben, dann wartet die Funktion 5 Sekunden und nichts passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091537</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 11 Jul 2011 19:36:11 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf für x Sekunden laufen lassen on Mon, 11 Jul 2011 19:47:51 GMT]]></title><description><![CDATA[<p>c++einsteiger schrieb:</p>
<blockquote>
<p>Evtl. könnte man den Aufruf ja in einem Thread ausführen, und dieser läuft x Sekunden, wäre das möglich?</p>
</blockquote>
<p>Threads abbrechen ist eigentlich immer eine ganz schlechte Idee. Das Problem ist, dass du nicht weisst was der Thread, zu dem Zeitpunkt wo er abgebrochen wurde, gerade gemacht hat. Dadurch kannst du die die Konsistenz aller möglichen Datenstrukturen zerstören (nicht nur eigener, auch welche die vom OS oder eine externen Library verwaltet werden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091540</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 11 Jul 2011 19:47:51 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf für x Sekunden laufen lassen on Mon, 11 Jul 2011 20:34:29 GMT]]></title><description><![CDATA[<p>Ich will halt erreichen, wenn nach der Zeit x keine Rückmeldung vom Server kommt, dass ich diesen Fehler behandeln kann.</p>
<p>Bei sleep() ist doch so, dass der Aufruf dann pausieren würde und wenn er in dieser Zeit etwas empfangen sollte, würde er nichts mitbekommen?...?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091555</guid><dc:creator><![CDATA[c++einsteiger]]></dc:creator><pubDate>Mon, 11 Jul 2011 20:34:29 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf für x Sekunden laufen lassen on Mon, 11 Jul 2011 21:40:59 GMT]]></title><description><![CDATA[<p>c++einsteiger schrieb:</p>
<blockquote>
<p>Ich will halt erreichen, wenn nach der Zeit x keine Rückmeldung vom Server kommt, dass ich diesen Fehler behandeln kann.</p>
</blockquote>
<p>Wenn die Library, die die Kommunikation mit dem Server implementiert, das nicht unterstützt, dann gibt es keinen wirklich schönen Weg das zu machen.</p>
<p>Und wenn sie es unterstützt, dann kannst/musst du die dafür vorgesehenen Funktionen/Einstellungen/... der Library verwenden.</p>
<p>Die einzige Möglichkeit, die mir sonst noch einfällt, ist die ganze Kommunikation in einen eigenen Thread auslagern, der den Hauptthread benachrichtigt wenn die Antwort angekommen ist.</p>
<p>Wenn sie nicht in der gewünschten Zeit ankommt, kannst du im Hauptthread weitermachen. Den Kommunikations-Thread musst du aber weiterlaufen lassen. Dabei musst du natürlich aufpassen, dass die Lebenszeit der ganzen beteiligten Objekte so geregelt ist, dass es auch nie passieren kann, dass etwas zu früh gelöscht wird bzw. gar nicht mehr gelöscht wird.</p>
<p>Also z.B. inetwa so:</p>
<pre><code class="language-cpp">shared_ptr&lt;Result&gt; DoStuffWithTimeout(shared_ptr&lt;Request&gt; const&amp; request)
{
    shared_ptr&lt;MyResultReceiverThing&gt; resultReceiver(new MyResultReceiverThing());

    StartStuffThread(resultReceiver, request);

    if (resultReceiver.TimedWaitForResult(MyTimeout))
        return resultReceiver.GetResult();
    else
        throw MyException(&quot;blah&quot;);
}

void StartStuffThread(shared_ptr&lt;MyResultReceiverThing&gt; const&amp; resultReceiver, shared_ptr&lt;Request&gt; const&amp; request)
{
    // ...
}

void StuffThreadFunction(shared_ptr&lt;MyResultReceiverThing&gt; resultReceiver, shared_ptr&lt;Request&gt; request)
{
     try
     {
         MyConnection conn;
         conn.Connect(request.GetAddress());
         shared_ptr&lt;Result&gt; const result = conn.SendRequest(request);
         conn.Close();

         resultReceiver-&gt;SetResult(result);
     }
     catch (std::exception const&amp; e)
     {
          resultReceiver-&gt;SetResult(ResultFromException(e));
     }
     catch (...)
     {
          resultReceiver-&gt;SetResult(ResultFromUnknownException());
     }
}
</code></pre>
<p>Das funktioniert OK, so lange conn.SendRequest() irgendwann mal selbst aufgibt, und das Timeout nicht zu hoch ist (verglichen mit der Frequenz der DoStuffWithTimeout() Aufrufe). Sonst kann es passieren, dass du so viele Threads erzeugst (die alle bloss rumhängen bis conn.SendRequest() endlich aufgibt), dass dem System die Resourcen ausgehen. Auf 32 Bit Windowsen ist z.B. typischerweise bei 2000 Threads schluss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091569</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 11 Jul 2011 21:40:59 GMT</pubDate></item></channel></rss>