C++ Style so richtig?



  • Hi,

    hab mal eine allgemeine Frage zu C++. Komme aus dem C-Bereich und hab deshalb noch ein paar Startschwierigkeiten:

    Ich möchte gern 10x serielle Ports ansprechen können. Dafür hab ich mir bis
    jetzt eine Klasse angelegt, die die entsprechenden Threads startet (senden und empfangen von seriellen Daten), sowie die angekommenden Daten überprüft.

    Für jeden seriellen Port verwendet man jetzt eine Instanz dieser Klasse, oder? Also insgesamt hätte ich dann 10x globale Variablen? Global deshalb, weil sie zu keiner Klasse wirklich passen. Das Document hat und ist keine serielle Schnittstelle.

    Auf diese globalen Variablen darf dann von überall zugegriffen werden, solange man sich im Mainthread befindet.... dann hab ich keinerlei Probleme bezüglich Synchronisation etc.?

    Gibt es sonst noch irgendwelche Sachen, die man in so einem Fall beachten soll? Ich möchte halt gern möglichst zu 100% C++ programmieren und keine C-Reste mehr im Programm sehen müssen 😉

    Gruß
    Konrad



  • Sobald du auf einen Thread zugreifst musst du synchronisieren. Dabei ist es egal, ob der Zugriff aus dem Hauptthread oder aus einem anderem Thread erfolgt.

    Idealerweise hast du eine Klasse, die das Lesen und Schreiben von der Seriellen Schnitstelle übernimmt. Am Besten startet diese Klasse einen Thread und kümmert sich auch um dessen Synchronisation.

    Außerdem hast du dann noch eine Klasse, die als Manager dieser Seriellen Schnitstellen dient.

    class Serial
    {
     // Write: Schreibt und synchronisiert den Thread
     // CanRead: Überprüft, ob etwas lesbar geworden ist
     // Read: Liest
    };
    
    class Manager
    {
     // 10x Serial
    
     // WriteToAll: Ruft für alle Instanzen Write auf
    };
    

    Das wäre mein Ansatz. Der Manager muss dann selber nichts mehr synchronisieren, er sagt dann z.B. einfach allen 10 Instanzen der Klasser Serial, dass sie schreiben sollen.

    Dabei kümmert sich dann die Klasse Serial selber darum, dass alles synchronisiert ist.

    Ansonsten musst du eben auch überprüfen, ob Threads überhaupt notwendig sind. Sollte es sich auch ohne Threads lösen lassen, dann solltest du auf diese tunlichst verzichten.



  • danke für deine Antwort:

    hab noch eine Frage: Die Einstellungen für diese Serialports nehme ich über ein Webinterface vor. Alle Einstellungen werden in einem einzigen Formular getätigt; so dass auch all diese Informationen mit einer Post-Http-Message geschickt werden.

    Der Http Socket befindet sich natürlich in einem anderen Thread als dem Mainthread. D.h. man muss eine oder mehrere PostMessages an den Mainthread schicken mit diesen Daten:

    Wie verpackt man diese Daten am sinnvollsten? Verwendet man eine Liste, eine Map? Sendet man eine PostMessage oder mehrere?

    Wenn ich die C++ Materie richtig verstehe, darf oder soll die Http-Klasse gar nicht wissen, welche Daten per PostMessage angekommen sind, sondern diese einfach an die richtige Klasse weiterleiten. Diese Weiterleitung würde ich dann im Document machen.



  • Handelt es sich bei dieser PostMessage um eine MFC-Funktion? Wenn dem so ist, dann geschieht die Synchronisation der Threads eventuell bereits über diese Funktion und du brauchst dich darum nicht zu kümmern. Aber genau sagen kann ich dir das nicht. Müsstest du dich informieren.

    Wie du die Daten jetzt "verpackst", kann ich dir auch nicht sagen. Wenn es sich um Textdaten handelt, die z.B. so aussehen

    Name=Blub
    Wert1=10
    Wert2=20

    dann kannst du das sicher als eine Map versenden, die als Key z.B. "Name" und als Wert "Blub" beinhaltet...



  • Ahh, du meinst PostMessage im Sinne von HTTP-Post? Wenn dem so ist, dann hat das natürlich nichts mit der Thread Synchronisation zu tun und du must dich noch immer selber darum kümmern. Wenn es sich nur um ein Formular handelt, dann sendest du natürlich auch nur eine POST-Message. Aus dieser extrahierst du dann die notwendigen Daten und setzt entsprechend die Einstellungen neu.

    Meinetwegen hast du eine Einstellung, wo die Ports festgelegt werden. Dann sagst du dem Manager, dass er der Klasse Serial sagen soll, dass die Ports sich geändert haben, etc...


Anmelden zum Antworten