Event erstellen und auslösen
-
Hi,
also ich denke, daß ich in den letzten 3 Monaten wirklich ein gutes Stück in C++ gelernt habe. Allerdings muß ich immer wieder feststellen, daß es anscheinend zu viele Dinge gibt, von denen ich immer noch nichts weiß. Hier nun das Thema Events.
Vorhaben:
Ich habe eine Klasse, die über einen Socket mit einem Server kommuniziert. Über den Socket empfange und sende ich Daten. Nun wollte ich das Programm eigentlich irgendwann plattformunabhängig machen. Ich entwickle jetzt im ersten Schritt allerdings auf Windows. Ich überprüfe im Moment mit select und poll, ob neue Daten vorhanden und Frage diese dann ab. Ich habe nun vor die Daten in eine Struktur zu packen und dann über ein Event an den Parent meiner Klasse zu schicken. Ich würde ungerne wxWidgets, MFC oder Ähnliches verwenden, sondern einfach nur nacktes C++. Ich weiß nun leider sehr wenig über Events.Aber könnte mir vielleicht jemand helfen, events mit vor mir gewählten Übergabeparametern sowohl in Windows als auch Unix zu erstellen und aufzurufen?
Vielen Dank im Voraus.
-
Das einfachste wäre wohl:
class Socket { public: virtual void onReceive(); }; class MySocket : public Socket { public: void onReceive() { /*do something*/ }; };
Beim erhalten lesen von Daten aus dem Socket, wird onReceive() aufgerufen und da MySocket von Socket erbt (der ganze code ist in Socket, lediglich onReceive wird in MySocket implementiert) wird MySocket::onReceive aufgerufen.
alternativ geht es über call backs.
dh
du registrierst eine Funktion oder Methode bei Socket - und diese wird dann beim jeweiligen Event aufgerufen.
-
Shade Of Mine schrieb:
alternativ geht es über call backs.
Dann doch lieber sowas wie boost::signals.
-
HumeSikkins schrieb:
Shade Of Mine schrieb:
alternativ geht es über call backs.
Dann doch lieber sowas wie boost::signals.
Und was findest du daran besser? Was ist überhaupt der Unterschied?
-
Und was findest du daran besser?
Weniger Abhängigkeiten, größere Entkopplung, Typsicher...
Was ist überhaupt der Unterschied?
Lies doch einfach das boost::signals-Tutorial. Oder das White-Paper über das Qt Signal/Slot-System.
-
Danke schon mal für die Antworten.
Also Callbacks würde ich eigentlich gerne vermeiden. Ich hatte einmal mit C-Callbacks in einer C++-Umgebung zu tun (siehe WinAPI-Klassen-Problem) und das hat mir nun wirklich nicht gefallen.Ich schwanke momentan noch zwischen zwei Möglichkeiten:
1. Ich habe in letzter Zeit viel mit wxWindows gemacht. Wenn ich die Socket- und Thread-Klassen von wxWindows (bzw. wxWidgets) verwende, leidet die Geschwindigkeit dann sehr stark? Ich würde eigentlich keine graphische Oberfläche erstellen, da es in angesprochenem Programm keine Notwenigkeit dafür gibt. Daher fällt mir die Entscheidung schwer wxWidgets einzusetzen. Wißt ihr, ob das wirkliche Auswirkung auf die Geschwindigkeit hätte?2. Die Methode von Shade mit der abgeleiteten Klasse. Hier allerdings ein prinzipielle Frage: Die Klasse Socket müßte doch in diesem Fall einen Thread starten, oder? Dieser prüft im Hintergrund auf Nachrichten und falls diese vorhanden sind, wird ein Event ausgelöst. Ohne Threads würde das Event doch nur ausgelöst werden, wenn ich von der Klasse Socket bzw. der abgeleiteten Klasse MySocket eine Funktion aufrufe, die auf neue Daten prüft. Habe ich das richtig verstanden?
Vielen Dank schon Mal.
-
Einen Thread wirst du wahrscheinlich sowieso brauchen wenn du _gleichzeitig_ auf ein Event wartest und anderen Code ausführen willst.
MfG SideWinder
-
wxWidgets ist doch nur ein Wrapper. Warum sollte da die Performance drunter leiden? Im übrigen ist wxWidgets in der aktuellen Version modularisiert. Man muß die GUI-lib nicht mehr mit verlinken. Du brauchst eigentlich nur die Module wxBase und wxNet. Ob wxThread in einem der Module drin ist, weiß ich nicht. Ich schätze mal in wxBase.
Hier eine Übersicht:
http://www.lpthe.jussieu.fr/~zeitlin/wxWindows/docs/wxwin26.htm#librarieslist
-
Okay, ich werde es dann mit wxWidgets machen.
Vielen Dank Euch allen für Eure Hilfe.
Viel Spaß noch.