Com Port, Sockets und Threads



  • Hallo!

    Ich möchte ein Programm schreiben, dass Daten, die es über eine Socketverbindung empfängt über die serielle Schnittstelle sendet, und Daten, die über die serielle Schnittstelle kommen über das Socket sendet.

    Es funktioniert eigentlich auch alles schon ganz gut nur leider benutze ich blockkierende Socket Funktionen. Das heisst es wird nur etwas über das Socket verschickt, wenn vorher etwas empfangen wurde, da die Empfangsfunktion recv() das Programm eben blockiert.

    Jetzt versuche ich das Senden in eine Thread auszulagern, habe da aber das Problem, dass ich in dem Thread keinen Zugriff auf meine COM Verbindung hinbekomme, da ja die Thread Funktion eine globale Funktion ist, die keinen Zugriff auf die in meinem Hauptprogramm erstellte COM Verbindung hat.

    Für die COM Verbindung habe ich eine Klasse geschrieben, die einen COM Port mit den entsprechenden Parametern öffnet, und Methoden zum Senden und Empfangen der Daten bereitstellt. Diese Klasse wird in dem Hauptprogramm instanziert.
    Also, wie bekomme ich jetzt Zugriff auf diese Instanz in meinem Thread?

    Das ganze soll wirklich nur mit WinAPI Funktionen realisiert werden.

    Gruß
    Maik



  • Dem Thread kann man ja einen Zeiger übergeben.



  • Okay, was ich aber noch vergessen habe zu erwähnen ist, dass ich natürlich auch das Socket an den Thread übergeben muss. Dann habe ich schon zwei Parameter. Ich kann aber der Threadfunktion nur einen Paramter übergenen (so weit ich das verstanden habe).

    Am liebsten wäre mir ein kleines Beispiel, wie ihr einen Thread erstellt und ihm eine Instanz und ein Socket übergebt. Ich habe leider keinen Code mehr zur Verfügung, da ich in letzter Zeit versucht habe mit nicht blockierenden Socket Funktionen zu arbeiten, aber das Thema auch erst mal wieder ad Akta gelegt habe, weil ich da nicht durchsteige. . . .



  • Kiamur schrieb:

    Okay, was ich aber noch vergessen habe zu erwähnen ist, dass ich natürlich auch das Socket an den Thread übergeben muss. Dann habe ich schon zwei Parameter. Ich kann aber der Threadfunktion nur einen Paramter übergenen (so weit ich das verstanden habe).

    Tja, wie wäre es denn mit einer Struktur?

    Die Frage ist allerdings, ob das dein Problem lösst weil der
    Thread wegen blockiertem Socket hängebbleibt. Ich erzeuge
    die Sockets immer nicht blockierend.

    Schau mal hier:

    http://www.sf.net/projects/cbccl .

    Da gibt es Klassen für Server und Client-Sockets die
    nicht blockierend sind. Läuft unter windows und linux
    und ist open source (frei verwendbar).



  • Kiamur schrieb:

    Okay, was ich aber noch vergessen habe zu erwähnen ist, dass ich natürlich auch das Socket an den Thread übergeben muss. Dann habe ich schon zwei Parameter. Ich kann aber der Threadfunktion nur einen Paramter übergenen (so weit ich das verstanden habe). ...

    Dann übergeb dem Thread einfach einen Pointer auf eine Struktur, die alle benötigten Daten enthält.

    Kaimur schrieb:

    Am liebsten wäre mir ein kleines Beispiel, wie ihr einen Thread erstellt und ihm eine Instanz und ein Socket übergebt. Ich habe leider keinen Code mehr zur Verfügung, da ich in letzter Zeit versucht habe mit nicht blockierenden Socket Funktionen zu arbeiten, aber das Thema auch erst mal wieder ad Akta gelegt habe, weil ich da nicht durchsteige. . . .

    Ich habe mir den Link von "nemeses" nicht genau angeschaut, aber eine Möglichkeit wäre noch select(), um zu überprüfen, ob auf dem Socket Daten zu lesen sind.
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/winsock_functions.asp



  • Hallo nemeses und Zerebus!

    Vielen Dank für eure Tips.

    @nemeses: Diese Lib hört sich ja verlockend an. Leider klappt der Download bei sf nicht. . . .

    @Zerebus: Das mit dem Thread reicht mir glaube ich aus. Ich habe dann im Hauptprogramm eine Schleife, die immer Daten über Socket empfängt, und diese dann über den Com Port weiterleitet. In dem Thread sende ich dann über den Socket. Von daher ist es ja egal, wenn dann die Funktionen blockieren, da sie die jeweils andere ja nicht behindern.

    Das mit der Struktur und den Pointern habe ich auch schon einmal versucht, aber da habe ich dann immer Fehler bekommen, dass die Struktur (!!!!!) keinen standard Konstruktor (???? in einer Struktur ?????) hat, und das ich auch nichts als virtuell deklarieren darf, obwohl ich gar nichts als virtuell deklariert hatte. Da habe ich mich dann lieber auf die Suche nach nicht blockierenden Socket Funktionen gemacht, wo ich aber dann auch gescheitert bin. Jetzt weiss ich gar nicht mehr, wie ich das machen soll. . . .



  • Ich hatte nur die Iddee, wenn du select verwendest, brauchst du keinen zusätzlichen Thread.
    Damit könntest du auch das Problem mit den Strukturen vergessen und das ganze Vorhaben würde sich aus meiner Sicht vereinfachen.

    Zerebus



  • Hallo Zerebus!

    Ich habe es jetzt mit select hinbekommen. Funktioniert tadellos.

    Vielen Dank!

    Maik


Anmelden zum Antworten