wxWidgets Consolen-Server schreiben
-
Hallo,
ich hab unter wxWidgets einen Server geschrieben (mit Fenster) und einen Clienten (der geht unter Linux und Windows). Server und Client sprechen auch richtig gut miteinander. Kein Problem.
Jetzt würde ich gerne mein Server-Programm auf einen öffentlichen Server stellen. Allerdings habe ich dort keine graphische Oberfläche (wozu auch). Also hab ich im Web gesucht nach der Möglichkeit mein Programm zum Dienst zu machen.
Wie man unter Linux einen Dienst macht weiß ich jetzt (Buch: "Linux-Unix Programmierung" von Jürgen Wolf), allerdings finde ich nichts wirklich sinnvolles um mein Server-Programm zum Commandozeilen-Server zu machen. Ich hab in der Doku von wxWidgets eine Class gefunden, die nennt sich wxAppConsole und diese scheint für den Zweck ausgelegt zu sein. Allerdings finde ich kein Sample oder Tutorial für diese Klasse. Auch die Google-Codesuche findet nicht wirklich ein Programm, dass diese Klasse sinnvoll nutzt.
Ich hab mir die Klasse mal angeschaut und versucht damit was brauchbares auf die Beine zu stellen. Allerdings steht in der Doku auch, dass die Anwendung beendet wird (also Main Loop fertig) wenn das letzte Fenster geschlossen wird. Ich will aber ja keine Fenster mehr. Also wie komm ich in den Main Loop ohne Fenster und wie kann ich den Main Loop sinnvoll wieder verlassen (in der Doku steht bei der Funktion exitMainLoop ich soll das letzte Fenster schließen).
Man merkt schon, ich bin mit meinem wxLatein am Ende und brauche dringend jemanden der mir sagen kann wie ich ein Serverprogramm als Prozess mit wxWidgets unter Linux erstellen kann.
Danke,
Stefan
-
Erstell einfach *kein* Fenster und schreibe deine Ausgabe auf die Standard-Output-Streams (STDOUT und STDERR).
-
Such mal im wxForum danach, da gabs mal nen Thread zu, wie man dienste mit wxWidgets macht.
Erster Schritt wäre, das du dir mal wxBase anschaust, das ist der Teil von wxWidgtes der GUI unabhängig ist.
Oder du nimmst nicht wxWidgets, und verwendest z.B. boost::asio.
-
Danke schon mal für euere Antworten.
Xantus schrieb:
Erstell einfach *kein* Fenster und schreibe deine Ausgabe auf die Standard-Output-Streams (STDOUT und STDERR).
Dann habe ich keinen Main-Loop. Die Netzwerkprogrammierung geht aber mit den Event-Handlern um und die werden nun man über den Main-Loop gesteuert.
Für die bildschirmausgabe gibts in wxWidgets auch noch wxPuts und solche Funktionen. Das hab ich schon gefunden (xw/string.h - http://zetcode.com/tutorials/wxwidgetstutorial/helperclasses/).phlox81 schrieb:
Such mal im wxForum danach, da gabs mal nen Thread zu, wie man dienste mit wxWidgets macht.
Erster Schritt wäre, das du dir mal wxBase anschaust, das ist der Teil von wxWidgtes der GUI unabhängig ist.
Oder du nimmst nicht wxWidgets, und verwendest z.B. boost::asio.
Nunja, mit boost hab ich mich noch nicht so richtig beschäftigt und mit wxWidgets läuft es schon. Also würde ich sehr ungerne umsteigen.
Die wxBase hab ich mir schon angeschaut. Allerdings konnt ich nicht wirklich so viel anfangen. Wahrscheinlich fehlt mir noch etwas die Erfahrung. Ich such jetzt erst mal den von dir angesprochenen Artikel im wxForum und dann studiere ich nochmal die wxBase und die wxApp. Mal schauen was ich noch finde.
-
Hier mal ein kurzes Beispiel wie man einen Event Loop ohne Fenster bzw. nur mit einem Konsolenfenster realisiert. Das ganze als Windows-Anwendung (statt Konsolenanwendung) und IMPLEMENT_APP (statt IMPLEMENT_APP_CONSOLE) sollte auch funktionieren.
#include <iostream> #include <wx/app.h> #include <wx/timer.h> int const ID_TIMER = wxNewId(); class Application : public wxApp { public: Application(); private: void OnTimer( wxTimerEvent& args ); wxTimer m_timer; DECLARE_EVENT_TABLE(); }; BEGIN_EVENT_TABLE( Application, wxApp ) EVT_TIMER( ID_TIMER, Application::OnTimer ) END_EVENT_TABLE() Application::Application() : m_timer( this, ID_TIMER ) { SetExitOnFrameDelete( false ); m_timer.Start( 1000 ); } void Application::OnTimer( wxTimerEvent& args ) { std::cout << "hallo" << std::endl; } IMPLEMENT_APP_CONSOLE( Application );