Wie einen Dienst programmieren??



  • Hallo Leute,

    ich hänge zurzeit an einem Problem und weiß nicht so recht wie ich es angehen muss. Hier mal kurz eine Pseudostruktur:

    int Variable1;
    int Variable2;
    int Variable3;
    
    int Initialisierung();
    int VerarbeiteDies(...);
    int VerarbeiteDas(...);
    int GebeInfos(...);
    

    Ich habe eine Menge von Variablen/Objekten und Funktionen. Die Funktionen werden mit irgendwelchen Parametern gefüttert und greifen auf die Variablen zu. Nun möchte ich das ganze irgendwie als einen Dienst nutzen und Kapseln. Der Zugriff auf diese Funktionen erfolgt später über verschiedene Threads.

    so könnte z.B. eine Aufrufabfolge aussehen:

    main     -> meinDienst::Initialisierung();
    thread 1 -> meinDienst::VerarbeiteDas(...);
    thread 2 -> meinDienst::VerarbeiteDas(...);
    thread 2 -> meinDienst::VerarbeiteDies(...);
    main     -> meinDienst::GebeInfos(...);
    thread 1 -> meinDienst::VerarbeiteDies(...);
    main     -> meinDienst::GebeInfos(...);
    ...
    

    Ich weiß nicht wie ich da rangehen soll. Mit threads habe ich in C++ noch nicht gearbeitet. Vorab: in meinem "Dienst" darf immer nur eine Funktion aktiv sein (also nicht 2 oder mehr simultan). Außerdem kann dieser Dienst nur einmal gestartet werden (es gibt also nicht mehrere Instanzen oder sowas).Hat jemand einen Tipp wie man an lösen könnte? Wie Kapsel ich am besten die Daten? ...als Klasse definieren? ...nur was mach ich dann mit einem Objekt der Klasse? ...und es darf ja sogesehen zur beim Programmende zerstört werden können. 😕

    ...oder macht man hier irgendwas mit namespaces?

    ...bin total ratlos 😞

    viele Grüße,
    SBond



  • Du hast jetzt zwar öfter viele Wörter mit anschließendem '?' hingeschrieben, aber ich verstehe nicht, was du eigentlich wissen willst.



  • Bin mir nicht sicher, ob ich verstanden habe, was genau du machen möchtest.
    Wenn du mehrere Aufgaben auf verschiedene Threads aufteilen möchtest könntest du das so lösen:

    1. Es gibt eine Basisklasse Task,Job, was auch immer. Davon leitest du deine verschiedenen Implementierungen für die jeweilige Aufgaben ab. Wenn du nur einen Aufgabentyp hast brauchst du dann nur die Task Klasse.

    2. du verwaltest eine Queue mit Tasks. Jeder Thread guckt nach, ob die Queue nicht leer ist, holt sich den ersten Task aus der Queue und bearbeitet ihn. Wenn er fertig ist holt er sich den nächsten oder beendet sich, wenn nichts weiter zu tun ist. Wenn sich alle Threads beendet haben sind alle Tasks erledigt.

    3. Kapsel deine Informationen.

    Ansonsten klingt das, was du schreibst, wirr.
    - Wie kapsel ich am besten die Daten? ...als Klasse definieren? Natürlich, wie sonst?
    - Nur was mach ich dann mit einem Objekt der Klasse? Rumreichen an das, was irgendwas damit anfangen kann.
    - und es darf ja sogesehen zur beim Programmende zerstört werden können. Ja, das sollte sogar immer so sein.

    Was genau meinst du eigentlich mit Dienst?



  • manni66 schrieb:

    Du hast jetzt zwar öfter viele Wörter mit anschließendem '?' hingeschrieben, aber ich verstehe nicht, was du eigentlich wissen willst.

    vereinfacht gesagt: ich möchte Funktionen mit den dazugehörigen Variablen kapseln (wie es z.B. in einer Klasse ist) und die Funktionen als Schnittstelle zur Verfügung stellen. Es ist gewisserweise ein globales Modul, auf das später mehrere Threads zugreifen dürfen. Ruft ein Thread eine Funktion aus diesem Modul auf, müssen die anderen Threads warten, bis das Modul wieder frei ist.

    Momentan ist erstmal der Hauptthread (main()) der einzige, der auf dieses Modul zugreifen wird.

    Edit:
    Eventuell ist die Lösung einfach ein globales Objekt zu erzeugen. Wahrscheinlich habe ich zu kompliziert gedacht.

    viele Grüße,
    SBond



  • Einfachste Lösung: du gibst deinem Dienst ein std::mutex als statische Membervariable. Jeder Bereich, der nur allein ausgeführt werden darf, definiert in dem entsprechenden Scope einfach einen std::lock_guard , den du mit dem Mutex initialisierst.

    Aber ich bin mir nicht sicher, ob das wirklich das ist, was du eigentlich willst.



  • vielen Dank für den Tipp.

    Ich glaube der grundsätzliche Weg, ist die Erstellung einer Klasse mit statischen Variablen/Funktionen. Ich muss ein wenig probieren, aber ich denke es passt.

    Erstmal vielen Dank 🙂



  • Statische Variablen sind fast nie eine gute Idee.
    Ausgehend von dem was du geschrieben hast, versteh ich zwar nicht was du willst, aber es sieht so aus, als ob du die Variablen als normale Instanzvariablen anlegen könntest und dann eine Instanz deiner Klasse "als Dienst" verwalten musst.


Log in to reply