B
manni66 schrieb:
C++ funktioniert im wesentlichen wie C: wenn eine Funktion eine andere aufruft, die eine andere aufruft, die eine andere aufruft, ... läuft dir irgendwann der Stack über. Da hilft es auch nicht, wenn die Boost signals Funktionen noch dazwischen liegen. Was du suchst sind möglicherweise Events.
Nein, darauf läuft es nicht hinaus. Der Funktionsstapel wird zwischendrin wieder vollständig abgebaut. Die Ausführungsdauer eines Kommandos beträgt mehrere Sekunden. Ja, es handelt sich hier um events. Leider habe ich im c++ standard keine events entdeckt.
Bsp:
1. webif ruft control.start("Zeiger auf Webif funktion") auf
2. control.start() merkt sich den Zeiger, rechnet ein paar sachen aus und stößt die Ausführung an (signalisierung an anderes Programm), damit ist die Funktion beendet
3. Die Ausführung erfolgt durch ein anderes Programm, wenn es fertig ist signalisiert es das
4. Aufruf einer control-Funktion (letzten Endes durch ein select() das feststellt das in einer Pipe Daten warten) -> diese verarbeitet die Daten und weiß nun das der letzte Befehl korrekt ausgeführt wurde
5. control signalisiert dem ursprünglichen Aufrufer (webif) das sein Befehl ausgeführt wurde
6. webif entscheidet was nun zu tun ist
SeppJ schrieb:
Das Ziel ist es mittels select() auf die Lesbarkeit des streames zu warten und dabei möglichst wenig Rechenzeit zu verschwenden.
Das verstehe ich sowieso nicht genau. Würde dein Programm währenddessen etwas anderes machen? Der Stream wartet sowieso, wenn keine Daten da sind (was anderes bleibt ihm ja auch gar nicht übrig). Du scheinst ein Problem zu lösen, welches schon längst gelöst bzw. gar nicht vorhanden ist.
Ja es gibt mehrere Pipes und Sockets die aber nicht immer Lesbar sind. Ich weiß nie welches gerade Lesbar ist. Je nachdem welches Lesbar ist müssen natürlich unterschiedliche Dinge getan werden.
SeppJ schrieb:
Deine andere Frage:
Warum holt sich control nicht selber das nächste Kommando, wenn es fertig ist?
Das wäre genauso möglich, das Problem bleibt aber das control wissen muss von wem es sich das nächste Kommando holt und über welche Funktion.
Das Ziel dabei soll es sein möglichst einfach neue Schnittstellen integrieren zu können. Mit diesem Konzept müsste ich nur eine neue Klasse schreiben die eine bestimmte callbackfunktion implementiert.