<?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[Arbeiten mit Events.]]></title><description><![CDATA[<p>Hey,</p>
<p>ich arbeite derzeit an einer (kleinen) TCP Komponente und würde gerne (wie ich es von Delphi mit Indy kannte) eigene Events schreiben, sprich: Wenn ich einen neuen CLient habe ein Event &quot;New Connection&quot; aufrufen. In Delphi ging das ja mit &quot;raise&quot; gibt es so etwas nun auch in C++? Wenn ja wie?</p>
<p>Danke!</p>
<p>PS: Ich arbeite mit dem QT Creator, das <a href="http://msdn.microsoft.com/en-us/library/ee2k0a7d.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ee2k0a7d.aspx</a> funktioniert da nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/321169/arbeiten-mit-events</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 11:34:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321169.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 26 Oct 2013 11:29:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Arbeiten mit Events. on Sat, 26 Oct 2013 11:34:44 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>ich arbeite derzeit an einer (kleinen) TCP Komponente und würde gerne (wie ich es von Delphi mit Indy kannte) eigene Events schreiben, sprich: Wenn ich einen neuen CLient habe ein Event &quot;New Connection&quot; aufrufen. In Delphi ging das ja mit &quot;raise&quot; gibt es so etwas nun auch in C++? Wenn ja wie?</p>
<p>Danke!</p>
<p>PS: Ich arbeite mit dem QT Creator, das <a href="http://msdn.microsoft.com/en-us/library/ee2k0a7d.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ee2k0a7d.aspx</a> funktioniert da nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363062</guid><dc:creator><![CDATA[Frolo]]></dc:creator><pubDate>Sat, 26 Oct 2013 11:34:44 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Sat, 26 Oct 2013 11:36:43 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/doc/libs/1_54_0/doc/html/signals.html" rel="nofollow">Boost.Signals</a> bietet etwas fertiges an. Natürlich kannst du dir auch etwas minimalistisches selber basteln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363064</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 26 Oct 2013 11:36:43 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Sat, 26 Oct 2013 11:39:01 GMT]]></title><description><![CDATA[<p>Gibt es nicht in Standard C++. Lebev und libevent bieten so etwas an, ich habe es aber selber nie benutzt.</p>
<p>Wenn du nicht nur mit dem Creator arbeitest, sondern mit Qt, kannst du die Qt Eventloop verwenden =&gt; siehe Qt Doku</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363065</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 26 Oct 2013 11:39:01 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Sat, 26 Oct 2013 11:41:10 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p><a href="http://www.boost.org/doc/libs/1_54_0/doc/html/signals.html" rel="nofollow">Boost.Signals</a> bietet etwas fertiges an. Natürlich kannst du dir auch etwas minimalistisches selber basteln.</p>
</blockquote>
<p>Signals sind synchron, Events in der Regel asynchron. Je nach Anwendungsfall passt das also nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363067</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 26 Oct 2013 11:41:10 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Sat, 26 Oct 2013 11:45:04 GMT]]></title><description><![CDATA[<p>Unterstützt C++ das nicht wie andere Sprachen von Haus aus?</p>
<p>Und ja das ganze sollte asynchron sein. Ich benutze den QT Creator nur als IDE, programmieren tue ich allerdings ohne die QT Libs ..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363068</guid><dc:creator><![CDATA[Frolo]]></dc:creator><pubDate>Sat, 26 Oct 2013 11:45:04 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Sat, 26 Oct 2013 14:08:20 GMT]]></title><description><![CDATA[<p>Kannst Du mir bitte etwas mehr über das &quot;Raise&quot; erzählen? Ich finde das in der Delphi-Doku nur in Bezug auf Exceptions... Würde gerne verstehen, was Delphi da von Haus aus kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363087</guid><dc:creator><![CDATA[EinerVonUns]]></dc:creator><pubDate>Sat, 26 Oct 2013 14:08:20 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Sun, 27 Oct 2013 20:40:15 GMT]]></title><description><![CDATA[<p>Sry kein Raise: <a href="http://www.delphi-treff.de/tutorials/vcl/komponenten-entwicklen/ereignisse-events/" rel="nofollow">http://www.delphi-treff.de/tutorials/vcl/komponenten-entwicklen/ereignisse-events/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363357</guid><dc:creator><![CDATA[Frolo]]></dc:creator><pubDate>Sun, 27 Oct 2013 20:40:15 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Sun, 27 Oct 2013 21:08:16 GMT]]></title><description><![CDATA[<p>Asynchrone Events sind eine sehr schlechte Idee. Das kombiniert die Nachteile von Threads und Events und bringt keine Vorteile. Entweder synchrone Events oder Threads benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363362</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Sun, 27 Oct 2013 21:08:16 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Mon, 28 Oct 2013 11:55:22 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Asynchrone Events sind eine sehr schlechte Idee. Das kombiniert die Nachteile von Threads und Events und bringt keine Vorteile. Entweder synchrone Events oder Threads benutzen.</p>
</blockquote>
<p>Events <strong>sind</strong> asynchron. Das hat mit Threads nichts zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363467</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 28 Oct 2013 11:55:22 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Mon, 28 Oct 2013 13:03:22 GMT]]></title><description><![CDATA[<p>Es geht hier sicherlich darum, dass gewisse &quot;Events&quot; in einem spezifischen Thread abgearbeitet werden müssen (zumeist auferlegt durch Einschränkungen der GUI-API)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363488</guid><dc:creator><![CDATA[EinerVonUns]]></dc:creator><pubDate>Mon, 28 Oct 2013 13:03:22 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Mon, 28 Oct 2013 13:06:00 GMT]]></title><description><![CDATA[<p>Dass das von der GUI-API abhängig ist, dass C++ da nicht wirklich etwas anbieten kann (außer mitzuhelfen durch thread-sichere Queues oder ähnlichem, was ja mit einem der nächsten C++-Standard mitkommt, glaube ich gelesen zu haben)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363491</guid><dc:creator><![CDATA[EinerVonUns]]></dc:creator><pubDate>Mon, 28 Oct 2013 13:06:00 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Mon, 28 Oct 2013 14:45:23 GMT]]></title><description><![CDATA[<p>Bei synchronen Events wird im Programm immer nur ein Event gleichzeitig abgearbeitet (das Betriebssystem arbeitet im Hintergrund noch an gestellten Aufgaben). Das hat den gigantischen Vorteil, dass man keine Dataraces hat, keine Locks braucht und damit auch keine Deadlocks bauen kann. Der Nachteil ist, dass sie etwas umständlich zu programmieren sind.<br />
Threads sind viel einfacher zu programmieren und haben bessere Performance, aber man kriegt Probleme mit Locks und Dataraces.<br />
Asynchrone Events sind umständlich zu programmieren und haben zusätzlich Dataraces und Deadlockprobleme. Wieso sollte man sowas jemals wollen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363528</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Mon, 28 Oct 2013 14:45:23 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Mon, 28 Oct 2013 14:50:15 GMT]]></title><description><![CDATA[<blockquote>
<p>Asynchrone Events sind umständlich zu programmieren und haben zusätzlich Dataraces und Deadlockprobleme. Wieso sollte man sowas jemals wollen?</p>
</blockquote>
<p>Wenn man Devices wie einen Comport hat, Daten liesst und kein Busy waiting haben moechte bzw. wenn ich Pakete verarbeiten will, wenn ich Zeit habe ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363529</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 28 Oct 2013 14:50:15 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Mon, 28 Oct 2013 15:21:50 GMT]]></title><description><![CDATA[<p>Frolo schrieb:</p>
<blockquote>
<p>Sry kein Raise: <a href="http://www.delphi-treff.de/tutorials/vcl/komponenten-entwicklen/ereignisse-events/" rel="nofollow">http://www.delphi-treff.de/tutorials/vcl/komponenten-entwicklen/ereignisse-events/</a></p>
</blockquote>
<p>Das sieht nach typischem GUI-Kram. Was Du meinst ist nicht &quot;raise&quot; sondern &quot;delegates&quot;. QT regelt sowas mit seinem Signal-Slot-Konzept. Wenn Du eh schon QT verwendest, dann schau dir das doch mal an.</p>
<p>Der &quot;GUI-Kram&quot; funktioniert in der Regel so, dass es da einen &quot;GUI-Thread&quot; gibt, der im Wesentlichen auf irgendwelche Ereignisse wie Benutzereingaben, Mouseklicks (etc) wartet und entsprechende Handler, die vorher registriert werden können, aufruft. Wenn du jetzt keine solche GUI-Anwendung baust, dann musst du dir ggf selbst so einen Event-Loop bauen oder es irgendwie anders machen. Für Netzwerk-Kram gibt's da sicherlich auch schon Sachen.</p>
<p>So etwas ähnliches wie &quot;delegates&quot; kannst du in C++11 auch mit std::function und Lambdas bekommen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;functional&gt;

void machdat(std::function&lt;void(int)&gt; func)
{
    func(42);
}

struct clazz
{
    void blah(int number) const
    { std::cout &lt;&lt; number &lt;&lt; std::endl; }
};

int main()
{
    clazz obj;
    machdat([&amp;](int num){obj.blah(num);});
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2363535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363535</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 28 Oct 2013 15:21:50 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Mon, 28 Oct 2013 15:26:46 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Asynchrone Events sind umständlich zu programmieren und haben zusätzlich Dataraces und Deadlockprobleme. Wieso sollte man sowas jemals wollen?</p>
</blockquote>
<p>Wenn man Devices wie einen Comport hat, Daten liesst und kein Busy waiting haben moechte bzw. wenn ich Pakete verarbeiten will, wenn ich Zeit habe ...</p>
</blockquote>
<p>dann verwendet man entweder eine &quot;blocking API&quot; (wo ein Leseversuch solange blockiert, bis was da ist, ohne dass das CPU-Zyklen verbrät) innerhalb eines eigenen Threads ... oder arbeitet mit 'nem Event-Loop, der, wenn was anliegt, Handler aufruft, die schnell fertig werden und dabei ggf neue Events anstoßen. Das ist recht ätzend zu programmieren, weil man sich irgendwo einen Zustand merken muss. Deswegen hat Microsoft dafür auch eine Lösung für C# zu bieten: async/Task&lt;&gt;. Die Programme sehen da fast so aus, wie die Versionen, die blockierende APIs verwenden. Unter der Haube baut der Compiler dann aus den <code>Task&lt;&gt;</code> - <code>return</code> enden <code>async</code> -Funktionen einen Zustandsautomaten und macht die Funktion damit &quot;resumable&quot;. In C++ haben wir so etwas aber (noch) nicht. Es gibt aber immerhin ein Proposal für &quot;resumable functions&quot;.</p>
<p>Ich wüsst aber auch gerne, wie man das eigentlich &quot;richtig&quot; in C++ machen würde, mit den Mitteln, die aktuell zur Verfügung stehen. Das ist einfach nicht mein Gebiet und hab deswegen da nicht die Erfahrung und kenne auch kaum Bibliotheken in der Hinsicht.</p>
<p>Ich hatte mal was von dem &quot;proactor model&quot; gehört, was <a href="http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio.html" rel="nofollow">Boost.ASIO</a> zu Grunde legen soll. Aber ich hatte bisher keinen Nerv, mir das alles durchzulesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363536</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 28 Oct 2013 15:26:46 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Mon, 28 Oct 2013 15:52:23 GMT]]></title><description><![CDATA[<blockquote>
<p>In C++ haben wir so etwas aber (noch) nicht. Es gibt aber immerhin ein Proposal für &quot;resumable functions&quot;.</p>
</blockquote>
<p>Wenn du Coroutinen fuer C++ meinst, die halte ich persoenlich fuer Bockmist. Aber vielleicht gefaellt es mir, wenn es fertig ist.</p>
<blockquote>
<p>Leseversuch solange blockiert</p>
</blockquote>
<p>Kommt beispielsweise nicht in Frage, wenn der Anwender die Anwendung schliesst, aber ein Read in einem anderen Thread auf sich warten laesst. boost::asio ist fuer Comports Overkill.</p>
<blockquote>
<p>Ich wüsst aber auch gerne, wie man das eigentlich &quot;richtig&quot; in C++ machen würde</p>
</blockquote>
<p>Ich verwende das klassische Schema: select + timeout in einem eigenen Thread als &quot;Service&quot;.</p>
<blockquote>
<p>Deswegen hat Microsoft dafür auch eine Lösung für C# zu bieten: async/Task&lt;&gt;.</p>
</blockquote>
<p>Sind sie kill-safe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363541</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 28 Oct 2013 15:52:23 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Mon, 28 Oct 2013 16:18:15 GMT]]></title><description><![CDATA[<p>Was ist an boost::asio eigentlich Overkill in Bezug auf COM-Ports? Wenn man sich vor Augen führt, dass boost::asio zB. unter Windows eigentlich nur ein Wrapper um IO-Completion-Ports ist (plus ein bissl Firlefanz für Dinge, die unter XP mit IOCPs noch nicht möglich waren, wie zB. Timer), dann kann der Overkill doch eigentlich gar nicht so groß sein. Ab Vista+ habe ich immer (verhältnismäßig) sehr gerne mit IOCPs gearbeitet. Die Frage ist nur, ob man sich boost antut oder nicht... Sieht halt immer komplizierter aus, als es eigentlich ist, dafür hat man keine Portierarbeit und die Sache ist gut getestet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363550</guid><dc:creator><![CDATA[EinerVonUns]]></dc:creator><pubDate>Mon, 28 Oct 2013 16:18:15 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Mon, 28 Oct 2013 20:28:24 GMT]]></title><description><![CDATA[<p>Okay, hab mir das von <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a> angeschaut (noch nicht getestet). Ich habe generell ja bis jetzt nur mit den Delphi Events gearbeitet, aber nach gründlichem Nachdenken, bin ich darauf gekommen, dass Events in Delphi doch synchron sind. Wenn ich ne while(1)-Schleife in ein Delphiprogramm schreibe und beispielsweise in ein ButtonClick Event schreibe, hängt sich das Programm (die GUI) auf. Deshalb denke ich, dass das ganze synchron ist.</p>
<p>Jetzt nochmal zu meiner Frage: Ist es durch den Vorschlag von &quot;krümelkacker&quot; möglich so etwas ähnliches zu machen:</p>
<pre><code>//PSEUDO-CODE
MeinTCPClient tcp1;

//-------------

void MeineProc {
 //die soll aufgerufen werden, wenn ein neuer Client connected
}

tcp1.OnConnect = MeineProc;
</code></pre>
<p>So würde ich mir das im Prinzip wünschen, dass es später eben genau so einfach ist. Kann ich das so machen (oder ähnlich) und wie müsste ich das dann innerhalb des Objekts umsetzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363591</guid><dc:creator><![CDATA[Frolo]]></dc:creator><pubDate>Mon, 28 Oct 2013 20:28:24 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Mon, 28 Oct 2013 20:38:00 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;functional&gt;

//...
std::function&lt;void()&gt; handler;
void somefunc() {}
handler = somefunc;
handler();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2363593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363593</guid><dc:creator><![CDATA[blubb]]></dc:creator><pubDate>Mon, 28 Oct 2013 20:38:00 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Mon, 28 Oct 2013 23:27:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Was ist an boost::asio eigentlich Overkill in Bezug auf COM-Ports?</p>
</blockquote>
<p>Weil man sich die Abhaengigkeit zu boost hereinholt, obwohl man das Beispiel aus der MSDN fuer Comports quasi abschreiben kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363614</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 28 Oct 2013 23:27:07 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Tue, 29 Oct 2013 09:47:29 GMT]]></title><description><![CDATA[<p>Frolo schrieb:</p>
<blockquote>
<p>Okay, hab mir das von <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a> angeschaut (noch nicht getestet). Ich habe generell ja bis jetzt nur mit den Delphi Events gearbeitet, aber nach gründlichem Nachdenken, bin ich darauf gekommen, dass Events in Delphi doch synchron sind.</p>
</blockquote>
<p>Du sagst &quot;Events&quot; meinst aber was anderes: Delegates. Über Delegates werden Handler festgelegt, die von einem Event-Loop aus aufgerufen werden.</p>
<p>Frolo schrieb:</p>
<blockquote>
<p>Wenn ich ne while(1)-Schleife in ein Delphiprogramm schreibe und beispielsweise in ein ButtonClick Event schreibe, hängt sich das Programm (die GUI) auf. Deshalb denke ich, dass das ganze synchron ist.</p>
</blockquote>
<p>Du schreibst kein &quot;Event&quot;. Du schreibst einen Handler, einen Handler der vom Event-Loop aus aufgerufen wird. Wenn der Handler dann eine Endlosschleife enthält und nicht zum Event-Loop zurückkehrt, dann kann das Program nicht mehr auf weitere Events reagieren. Um die GUI &quot;ansprechbar&quot; zu halten, müssen Handler also schnell abgearbeitet werden.</p>
<p>Frolo schrieb:</p>
<blockquote>
<p>Jetzt nochmal zu meiner Frage: Ist es durch den Vorschlag von &quot;krümelkacker&quot; möglich so etwas ähnliches zu machen:</p>
</blockquote>
<p>Du wolltest wissen, wie man delegates in C++ bekommen würde, wobei du statt &quot;delegates&quot; eben &quot;events&quot; gesagt hast. Dazu hatte ich ein Beispiel. Ein Event-Loop ist u.a. irgendwo in QT implementiert. Sowas kann man sich selbst bauen. Muss man möglicherweise aber nicht. Da hört dann auch meine Expertise auf.</p>
<p>Frolo schrieb:</p>
<blockquote>
<pre><code>//PSEUDO-CODE
MeinTCPClient tcp1;

//-------------

void MeineProc {
 //die soll aufgerufen werden, wenn ein neuer Client connected
}

tcp1.OnConnect = MeineProc;
</code></pre>
<p>So würde ich mir das im Prinzip wünschen, dass es später eben genau so einfach ist. Kann ich das so machen (oder ähnlich) und wie müsste ich das dann innerhalb des Objekts umsetzen?</p>
</blockquote>
<p>Dann brauchst du einen Event-Loop, der mit einer Message-Queue arbeitet, wo man solche Events reinstecken kann.</p>
<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Was ist an boost::asio eigentlich Overkill in Bezug auf COM-Ports?</p>
</blockquote>
<p>Weil man sich die Abhaengigkeit zu boost hereinholt, obwohl man das Beispiel aus der MSDN fuer Comports quasi abschreiben kann.</p>
</blockquote>
<p>Verlink das doch mal. Ich hatte anfang dieses Jahres da nur mal mit einer &quot;blocking API&quot; gearbeitet. Und das war ein recht simples C-Interface, wo ich erstmal einen C++-Wrapper für RAII drumherum gebaut habe. Das ganze dann noch verPIMPLt, so das im Header nix System-spezifisches mehr steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363657</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 29 Oct 2013 09:47:29 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Tue, 29 Oct 2013 12:16:58 GMT]]></title><description><![CDATA[<p><a href="http://msdn.microsoft.com/en-us/library/ff802693.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ff802693.aspx</a> war meine Basis fuer meine eigene Comport-Klasse. Nun einfach sieht anders aus, aber was solls ... Das Hauptproblem bei overlapped IO ist, dass ich benachrichtigt werde, wenn meine Operation abgeschlossen ist. Es ist schwierig, eine gestartete Operation korrekt abzubrechen. Das Konzept unter Unix ist, ich werde benachrichtig wenn etwas verfuegbar ist. Das Problem des Abbrechens gibt es dort nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363679</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 29 Oct 2013 12:16:58 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Tue, 29 Oct 2013 13:49:29 GMT]]></title><description><![CDATA[<p>Ich finde die Unterteilung synchron vs. asynchron sinnlos.<br />
Event-Callbacks werden immer synchron aufgerufen, die Frage ist nur synchron mit was.<br />
Das muss man halt wissen, und dann kann man das Programm entsprechend darauf auslegen.</p>
<p>Falls man sich nicht mit Multithreading auskennt, dann wäre es natürlich vorteilhaft wenn es nur einen Thread gibt, und von diesem auch die Event-Callbacks ausgeführt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363698</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 29 Oct 2013 13:49:29 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Tue, 29 Oct 2013 16:03:45 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p><a href="http://msdn.microsoft.com/en-us/library/ff802693.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ff802693.aspx</a> war meine Basis fuer meine eigene Comport-Klasse. Nun einfach sieht anders aus, aber was solls ... Das Hauptproblem bei overlapped IO ist, dass ich benachrichtigt werde, wenn meine Operation abgeschlossen ist. Es ist schwierig, eine gestartete Operation korrekt abzubrechen. Das Konzept unter Unix ist, ich werde benachrichtig wenn etwas verfuegbar ist. Das Problem des Abbrechens gibt es dort nicht.</p>
</blockquote>
<p>Habe jetzt nicht auf den Link geklickt, aber ich frage mich gerade, wo der Unterschied zwischen Windows und Unix Deiner Beschreibung nach sein soll. die erklärung ist nämlich fast gleich, bis auf dass du einmal &quot;wenn die Operation abgeschlossen ist&quot; und das andere mal &quot;wenn etas verfügbar ist&quot; sagst. Meinst du bei &quot;etwas&quot; hier _irgend_ etwas? Also eine Queue, wo alle Events reinkommen statt eines Callback-Mechanismus bei Windows?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363712</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 29 Oct 2013 16:03:45 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Tue, 29 Oct 2013 21:34:19 GMT]]></title><description><![CDATA[<p>Er meint reactive IO vs. proactive IO.</p>
<p>Reactive heisst dein Programm lässt sich benachrichtigen wenn es was machen kann, und reagiert auf diese Benachrichtigung indem es was macht.<br />
select() -&gt; read(non-blocking aber synchron, Daten stehen bereits in eine Puffer des OS und werden direkt im read-Auftuf in den Puffer das Applikation kopiert).</p>
<p>Proactive heisst dein Programm sagt dem OS vorab schonmal was es machen soll, und bekommt dann eine Benachrichtigung vom OS wenn die Operation abgeschlossen wurde (egal ob jetzt mit Fehler oder Erfolg).<br />
BeginRead() -&gt; Daten werden irgendwann im Hintergrund gelesen und in den Puffer der Applikation kopiert -&gt; Callback -&gt; EndRead()</p>
<p>Der Unterschied was Cancellation angeht...</p>
<p>Bei reactive gibt es keine &quot;ausständigen&quot; IOs, d.h. es gibt auch nichts zu canceln. Nur dann wenn man die &quot;jetzt ginge was&quot; Benachrichtigungen auf einem (oder mehreren) anderen Threads annimmt, als der wo man ein Objekt zerstören will, muss man etwas aufpassen.</p>
<p>Bei proactive dagegen hast du einen oder mehrere IOs ausständig, die jederzeit abgeschlossen werden können. Wenn du dein Objekt zerstören willst, musst du nun entweder sicherstellen dass vorher alle Benachrichtigungen verarbeitet wurden, oder dass du bei den Benachrichtigungen irgendwie mitbekommst dass das Objekt bereits zerstört wurde (oder dabei ist zerstört zu werden -- z.B. über die Verwendung eines <code>weak_ptr</code> ).<br />
Beide Varianten sind allerdings lästig, und auch nicht ganz trivial fehlerfrei hinzubekommen.<br />
(Der Puffer muss natürlich auch gültig bleiben bis die Operation abgeschlossen wurde.)</p>
<p>Wobei man auch unter Windows reactive IO verwenden kann. Und auch unter Linux proactive IO.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363768</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 29 Oct 2013 21:34:19 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeiten mit Events. on Tue, 29 Oct 2013 23:06:16 GMT]]></title><description><![CDATA[<p>Okay, eure Antworten waren sehr hilfreich! Ich kannte bisher den Unterschied zwischen Events und Delegates leider nicht, ihr habt mir da sehr geholfen. Was ich mich nun gefragt hab ist folgendes:</p>
<pre><code>//PSEUDO-CODE
MeinTCPClient tcp1;

//-------------

void MeineProc {
 //die soll aufgerufen werden, wenn ein neuer Client connected
}

tcp1.OnConnect = MeineProc;
</code></pre>
<p>Wenn das mein Code wäre, könnte ich doch innerhalb der Klasse &quot;MeinTCPClient&quot; die Methode (ich glaub ihr habt das Handler genannt), die ich hier übergebe (Meine Proc) in einem anderen Thread ausführen oder? [Aber so, dass hierbei die Klasse und nicht etwa meine main.cpp steuert, ob das ganze synchron oder asynchron zum main - Programm läuft. Ich hoffe ihr versteht, was ich meine. Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363798</guid><dc:creator><![CDATA[Frolo]]></dc:creator><pubDate>Tue, 29 Oct 2013 23:06:16 GMT</pubDate></item></channel></rss>