Multi-User - wie?



  • Hallo zusammen,
    zu meinem Projekt habe ich einer Reihe von Header-Dateien geschrieben. Eine davon macht sehr viel Gebrauch von lokalen Variablen (in der Header-Datei). Nun habe ich alle diese Variablen zu einer struct ("sys") zusammengestellt und in diese Headerdatei einen Zeiger auf sys gelegt. Jetzt möchte ich aber mehrere solcher "Systeme" gleichzeitig laufen lassen (Multi-User)...
    Ich überlege schon länger, aber mir fällt nichts ein. Natürlich kann man jede Funktion mit Parametern anstatt von lokalen Variablen ausstatten, aber damit gibt es viele Probleme, z.B. ist es ein Krampf beim Benutzen der Funktionen, ein Arbeitsaufwand ist auch damit verbunden und so kann ich sicherstellen, dass die Funktionen genau die Daten bekommen, die sie brauchen.
    Also, habt ihr irgendeine Idee für das Problem?

    Vielen Dank schon Mal im Voraus und einen schönen Restsonntag 😉
    Gruß
    LauritzG



  • Wie wärs mit Klassen und Member-Funktionen?

    Globale Variablen in Header Dateien sind sehr sehr schlechter Stil und sollten vermieden werden.



  • Janjan schrieb:

    Wie wärs mit Klassen und Member-Funktionen?

    Globale Variablen in Header Dateien sind sehr sehr schlechter Stil und sollten vermieden werden.

    Dessen bin ich mir bewusst! Deswegen habe ich ja jetzt auch das alles gekapselt.

    Ich möchte das Programm nicht mit C++-Klassen schreiben, da das Einfluss auf die Geschwindigkeit hat (Computer Vision).

    Ich sehe aber auch keine Alternative. Wenn ich mir das Ganze in die Parameter schreibe, habe ich eine Menge Arbeit zu tun, und zwar nicht nur bei Umschreiben jetzt, sondern auch beim Verwenden der Funktionen. Außerdem sind es immer genau die gleichen Daten, die ich unbedingt benötige, und sie jedes Mal vor dem Verwenden des Codes zu definieren ist lästig. Ich habe ja jetzt schon die lokalen Variablen ausgelagert in eine struct, die man dann in der Quelldatei (.cpp) definieren muss und den Zeiger in der Header-Datei auf dieses Datenpalet referenzieren muss. (Ich weiß, es klingt verworren...)

    Gruß,
    LauritzG



  • LauritzG schrieb:

    Ich möchte das Programm nicht mit C++-Klassen schreiben, da das Einfluss auf die Geschwindigkeit hat (Computer Vision).

    Woher hast du den Unsinn denn?



  • LauritzG schrieb:

    Ich möchte das Programm nicht mit C++-Klassen schreiben, da das Einfluss auf die Geschwindigkeit hat (Computer Vision).

    Da wüsste ich jetzt schon gern, wie du zu diesem Schluss gekommen bist.

    LauritzG schrieb:

    Eine davon macht sehr viel Gebrauch von lokalen Variablen (in der Header-Datei).

    Was verstehst du unter lokalen Variablen? Kannst du kurz in einem Stück Code wiedergeben, wie das momentan aussieht?



  • LauritzG schrieb:

    Ich möchte das Programm nicht mit C++-Klassen schreiben, da das Einfluss auf die Geschwindigkeit hat (Computer Vision).

    Ich kann zwar nachvollziehen, dass man in CV nie genug Rechenleistung haben kann (ich bin ja selbst glorreicher schreiber eines "echtzeitfähigen" Fahrerassistenzsystems mit <10fps), aber es liegt selten bis nie an der Abstraktion durch C++. Eher im Gegenteil. Oft erspart sie durch übersichtlichen Code viele viele Berechnungen. Ich sag nur "hey, da können wir was verallgemeinern und ersparen uns ne iteration durchs Bild". Meistens sinds doch die Algorithmen die zu langsam sind. Und da machts keinen unterschied ob du den Algo in einer Klasse kapselst oder nicht. Ob der Function call 2 Takte länger dauert bei 1000000 Taktzyklen Berechnungszeit in der Funktion ist ehrlich nicht mehr der Rede wert.



  • otze schrieb:

    Ob der Function call 2 Takte länger dauert

    Das lustige:

    o->foo(bar);
    

    braucht wenigter takte als

    foo(o, bar);
    

    🙂



  • Solange man keine virtuellen Funktionen haben, haben Klassen absolut keinen Overhead gegenüber losen Funktionen.



  • C ist doch wohl schneller als C++? Ich auf jeden Fall habe das jetzt schon sehr oft gelesen... 😕

    Beispiel mit Code:
    Also, eine Funktion aus der Kern-Datei (core.h) muss auf das neueste Bild zugreifen, das die Kamera gesendet hat. Dieses Bild wird durch einen parallelen Thread immer wieder aktualisiert. Dieses neueste Bild hatte ich als lokale Variable angelegt.
    Nun gibt es eine neue struct namens sys, die alle diese Variablen beinhaltet.
    Von ihr gibt es in core.h einen Zeiger:

    sys *systm;
    

    Wenn ich nun auf dieses Bild zugreife, geht das über

    systm->neuestes
    

    .
    Jetzt muss jeder, der die Header benutzen möchte, in seiner Quellcodedatei ein sys-Objekt anlegen, es mit Daten füllen und den Zeiger in der Core-Datei dementsprechend verändern (dass er auf das sys-Objekt zeigt). (BTW: Ich rede hier von Objekt als Instanz einer struct, nicht einer Klasse).
    Nur am Rande: Das Starten der Threads, die das Programm zum Laufen bringen, wird von einer eigenen Funktion übernommen (start_system()).

    Gruß,
    LauritzG

    PS: @otze: Ja, da hast du wohl Recht. Aber irgendwie kann ich mich nicht dazu durchringen, jetzt wieder alles über den Haufen zu werfen. Trotzdem, wenn es nicht anders geht, werde ich wohl mit cpp fahren müssen...



  • Janjan schrieb:

    Solange man keine virtuellen Funktionen haben, haben Klassen absolut keinen Overhead gegenüber losen Funktionen.

    Und selbst mit virtuellen Funktionen bist du in der Regel noch schneller unterwegs, als wenn du ein Pendant zu diesen selbst baust.



  • LauritzG schrieb:

    C ist doch wohl schneller als C++? Ich auf jeden Fall habe das jetzt schon sehr oft gelesen... 😕

    Das ist ein uralter Mythos, der vor vielen vielen Jahren stimmte, heute aber nicht mehr. Leider hält er sich nach wie vor hartnäckig..



  • LauritzG schrieb:

    @otze: Ja, da hast du wohl Recht. Aber irgendwie kann ich mich nicht dazu durchringen, jetzt wieder alles über den Haufen zu werfen. Trotzdem, wenn es nicht anders geht, werde ich wohl mit cpp fahren müssen...

    Ich würde C++ gegenüber C als eine Erleichterung ansehen. Und zwar, was Entwicklungs- und Debugzeit als auch Erweiterbarkeit anbelangt. Aber du darfst natürlich gerne C nehmen. 😉

    Janjan schrieb:

    Das ist ein uralter Mythos, der vor vielen vielen Jahren stimmte, heute aber nicht mehr. Leider hält er sich nach wie vor hartnäckig..

    Genau. Wieso muss Abstraktion zwangsläufig Einflüsse auf Performance haben? Wir sind ja nicht in Java... :p



  • LauritzG schrieb:

    C ist doch wohl schneller als C++? Ich auf jeden Fall habe das jetzt schon sehr oft gelesen... 😕

    Nein.

    Ob du
    foo(bar)
    oder bar.foo() schreibst ist nur syntaktischer zucker - nicht mehr.

    Also, eine Funktion aus der Kern-Datei (core.h) muss auf das neueste Bild zugreifen, das die Kamera gesendet hat. Dieses Bild wird durch einen parallelen Thread immer wieder aktualisiert. Dieses neueste Bild hatte ich als lokale Variable angelegt.

    Und wie synchronisierst du das?

    Nun gibt es eine neue struct namens sys, die alle diese Variablen beinhaltet.
    Von ihr gibt es in core.h einen Zeiger:

    sys *systm;
    

    Wenn ich nun auf dieses Bild zugreife, geht das über

    systm->neuestes
    

    .

    Absoluter schwachsinn - wuerde aber mit Klassen genasuo gehen.

    Merke: eine struct und eine Klasse sind identisch (mit der einzigen Ausnahme der default Sichtbarkeit).

    Ja, da hast du wohl Recht. Aber irgendwie kann ich mich nicht dazu durchringen, jetzt wieder alles über den Haufen zu werfen. Trotzdem, wenn es nicht anders geht, werde ich wohl mit cpp fahren müssen...

    Alles was du bis jetzt gesagt hast deutet stark darauf hin das alles wegschmeissen das einzig sinnvolle ist...

    Aber bitte, zeig etwas mehr von deinem Design - vielleicht kann man es ja einfach fixen.



  • LauritzG schrieb:
    @otze: Ja, da hast du wohl Recht. Aber irgendwie kann ich mich nicht dazu durchringen, jetzt wieder alles über den Haufen zu werfen. Trotzdem, wenn es nicht anders geht, werde ich wohl mit cpp fahren müssen...
    Ich würde C++ gegenüber C als eine Erleichterung ansehen. Und zwar, was Entwicklungs- und Debugzeit als auch Erweiterbarkeit anbelangt. Aber du darfst natürlich gerne C nehmen. 😉

    Gut, dann bin ich ja erleichtert. Bin jetzt gerade dabei, mir das Ganze zu Klassen umzubauen. Was schon struct ist, lasse ich einfach so.

    Zitat:
    Also, eine Funktion aus der Kern-Datei (core.h) muss auf das neueste Bild zugreifen, das die Kamera gesendet hat. Dieses Bild wird durch einen parallelen Thread immer wieder aktualisiert. Dieses neueste Bild hatte ich als lokale Variable angelegt.

    Und wie synchronisierst du das?

    Ähem,... es klappt zumindest Mal, ich hab mir die Variable als Livebild in ein Fenster gelegt und es lief ruckel- und absturzfrei.

    Gut, so bin jetzt Mal an der Arbeit, mal sehen ob das was wird...

    Auf jeden Fall Mal vielen, vielen Dank für die schnelle und gute Hilfe. Und ab jetzt bin ich objektorientiert. 😉

    Vielen Dank,
    Gruß,
    LauritzG 😃


Log in to reply