Wie kann man Ereignisse innerhalb eines Projektes auslösen bzw. darauf reagieren?
-
Wieder mal eine Frage über die ich mir so meine Gedanken mache.
Wie würde das beispielsweise gemacht werden müssen, wenn man sowas wie einen Timer hat, der bei einem festegelegten Intervall, sagen wir mal 1000, immer wieder auf 0 zurückspringt und dabei ein Eregnis OnTimer auslöst. Das Ereignis soll dann meinetwegen eine Ausgabe machen cout<<"irgendwas<<...
Ich hoffe es kann jemand verständlich und nachvollziebar erklären. Danke im Voraus!
-
Mit Funktoren bzw simplem Funktionspointern wär sowas machbar!

grüße
-
Hallo,
was genau ist denn deine Frage? Willst du wissen, wie man einen solchen Timer erzeugt? Falls ja, dass ist BS-abhängig. Welches BS verwendest du? Und welchen Compiler bzw. welche Klassenbibliothek?
-
Willst du wissen, wie man einen solchen Timer erzeugt?
Das eigentlich weniger, wäre aber auch eine Frage wert und wenn das hier nicht unwichtig ist wäre es sinnvoll das gleich zu klären. Der timer war nur ein Beispiel weils mir halt so am plausibelsten erscheint.
BS ist Linux (Suse 10). Kompiler GNU g++ müsste es sein.
-
dixidix schrieb:
...Der timer war nur ein Beispiel weils mir halt so am plausibelsten erscheint....
Tja, anscheinend ist wohl nicht klar rübergekommen, wofür das ein Beispiel sein soll.... ich hab's auch nicht verstanden.
Meinst Du vielleicht sowas wie eine Callback-Funktion ?Gruß,
Simon2.
-
Wenn die Sache mit einem Timer nicht verständlich ist, lassen wir das. Wäre es einfache das anhand eines Dämons zu erklären? Wie würde es denn bei einem Dämon funktionieren?
-
Unter Linux werden POSIX Timer unterstützt. Eine Beschreibung mit Beispiel gibt es unter anderem hier. POSIX ist unter IEEE 1003.1 standardisiert.
-
Hi,
also ich weiß nicht genau, aber mir scheint es, als erwartetest Du eine spezielle neue "Nachricht/Ereignis/...-Technik", die etwas anderes ist, als ein Funktionsaufruf. Letztlich wird es aber genau das sein: Eine Funktion wird aufgerufen. Da ist nicht viel "magic" drin. Mir ist sogar öfter schon ein als "oo-spezifische Bezeichnung" für "Funktionsaufruf" der Begriff "Nachricht" biw. "Ereignisanforderung" begegnet.
Aber wer weiß das schon so genau .... ?! ....
Gruß,
Simon2.
P.S. Vielleicht geht es Dir auch einfach nur darum, dass eine Anwendung in 2 "Komponenten" geteilt ist, bei der die eine ("Client") den anderen ("Server") aufruft...
-
Naja, eigentlich will er einfach nur einen Thread im Hintergrund laufen lassen, der nach einer ganz bestimmten Zeit etwas ausführt (z.B. eine Funktion). Eigentlich ist das Tagesgeschäft eines Programmierers. Man muß nur ein paar Dinge kombinieren: man nehme eine Priese Threads, ein bischen DateTime-Funktion und zu guter letzt etwas Signal-Slot. Wer kein Signal-Slot im Haus hat, kann alternativ auch ein Command-Pattern nehmen.
-
Naja, so richtig Input habe ich bisher nicht
. Ich kenn' das bespielsweise von VB. Da gibt's den Befehl "RaiseEvent". Ist in C++ nicht auch sowas in der Art vorhanden?
-
Derzeit stehen etwa 3 Thesen im Raum, was Du wohl gerne tun möchtest. Sag doch einfach mal konkret was Du machen möchtest. Also nicht so vage wie "irgendwas mit timer und funktion, aber ist nur ein beispiel". Du kannst ja das Problem ruhig vereinfachen, aber es sollte nicht zu vage werden.
-
Ich wills mal etwas besser erklären.
Also: z.B: Ich habe ein Programm pgm.cpp welches eine Funktion enthält die beispielsweise den Status eines Gerätes mittels Treiberabfrage zurückgibt. Also true oder false. Jetzt soll das ganze natürlich von selbst laufen. Dafür soll ein Ereignis her, dass sagt OnDeviceON oder OnDeviceOff auf das man reagieren kann.
Man könnte das sicherlich mit einer Timerlösung machen, wo der Devicestatus permanent abgefragt wird und dann entsprechend das Ereignis ausgelöst wird.
In dem Fall würde das in dem Programm ja selbst ablaufen und man könnte das auch über eine gewöhnlich Funktion laufen lassn.
Was ich wissen möchte ist wenn diese Ereignis client-server-mäßig nutzbar wäre, also man das Ereignis aus einem anderem Programm nutzen kann. Das Programm wäre dann quasi ein Dämon oder ... Ich wüsste nicht wie ich das noch anders erklären sollte.
-
In C++ gibt es keinen syntaktischen Zucker für Ereignisse. Man möchte einfach nicht vorschreiben, wie Events zu realisieren sind. In Java werden Events zum Beispiel über das Beobachter Muster / Observer Pattern angeboten. In Wirklichkeit gibt es aber, wie bereits erwähnt wurde viele andere Techniken, um Ereignisse zu ermöglichen. Dabei können nicht nur verschiedene Muster angewandt werden, sondern es gibt, wie der Name schon sagt, verschiedene Möglichkeiten, ein einzelnes Muster zu implementieren. Hier ein lauffähiges Beispiel, welches an das Beobachter Entwurfsmuster angelehnt ist:
#include <iostream> #include <list> #include <string> using namespace std; template<typename TEventArg> class IEventListener { public: virtual ~IEventListener(){} virtual void eventRaised(TEventArg &arg) = 0; }; template<typename TEventArg> class EventRaiser { public: void raiseEvent(TEventArg arg) { for(typename list<IEventListener<TEventArg> *>::iterator iter = m_listeners.begin(); iter != m_listeners.end(); ++iter) (*iter)->eventRaised(arg); } void addListener(IEventListener<TEventArg> *listener) { m_listeners.push_back(listener); } private: list<IEventListener<TEventArg> *> m_listeners; }; template<typename TEventArg> class FooEventListener : public IEventListener<TEventArg> { public: void eventRaised(TEventArg &arg) { cout << "Foo: " << arg << endl; } }; template<typename TEventArg> class BarEventListener : public IEventListener<TEventArg> { public: void eventRaised(TEventArg &arg) { cout << "Bar: " << arg << endl; } }; int main() { EventRaiser<string> raiser; FooEventListener<string> foo; BarEventListener<string> bar; raiser.addListener(&foo); raiser.addListener(&bar); raiser.raiseEvent("Test"); return 0; }