Threadproblem bei Server-Client-Programm



  • Indem du auf einem Thread die join - Methode aufrufst, wartest du auf Beendigung des Threads. Wenn der Thread nicht beendet wird, passiert also auch nichts.



  • Und wie ist es möglich, dass ein Thread wirklich _parallel_ läuft`?



  • Dein Thread läuft doch parallel, du darfst halt nur nicht auf seine Beendigung warten - oder eben an anderer Stelle.



  • Gibt es denn Methoden, die den Thread starten und nicht warten, bis dieser zu Ende gelaufen ist, sondern dass Programm weiterläuft und der Thread im Hintergrund auch?

    Irgendwie verstehe ich den Sinn dahinter nicht. Ein Thread ist doch gerade dazu da, dass mehrere Dinge gleichzeitig laufen. Dann ist es doch Schwachsinn, dass erst gewartet werden muss, bis der Thread durchgelaufen ist und dann erst weiter gemacht wird 😕



  • Ich glaube wir beide reden aneinander vorbei. Lass doch einfach das join weg 😉



  • Achso, das bedeutet, ein Thread läuft automatisch, ohne erst den thread wie in Java zu starten?

    Habe dennoch ein weiteres Problem:
    Ich kann jetzt eine Nachricht eingeben, aber keine weitere.
    Die Ausgabe ist folgende (bei der Ausführung des Clients)

    Enter message: Testnachricht
    Enter message: We received this response from the server:
    "Empfangen: Testnachricht"
    terminate called after throwing an instance of 'SocketException'
    Aborted
    

    Dabei schließe ich doch die Verbindung nicht, oder?

    EDIT: Ich habe herausgefunden, das Problem liegt an der Schleife im Thread der Clientconnection. Es wird wieder versucht, etwas zu empfangen, aber dies funktioniert nicht. Dabei soll doch nur empfangen werden, wenn etwas geschickt wurde..



  • Ein Thread wird im Kontruktor gestartet, ja. RAII eben.



  • Verstehe 🙂

    Kann denn irgendwie diese Exception verhindert werden?
    Die wird ja durch den >> Operator ausgerufen, welcher so aussah:

    const ClientSocket& ClientSocket::operator >> ( std::string& s ) const
    {
      if ( ! Socket::recv ( s ) )
        {
          throw SocketException ( "Could not read from socket." );
        }
    
      return *this;
    }
    

    Übergebe ich einen falschen String oder warum kommt die Fehlermeldung?



  • Schau dir das Verhalten doch mal im Debugger an - aber ich würde vermuten, der Socket ist nicht initialisiert, oder er liefert tatsächlich gerade keine Daten.

    PS: Ich würde dort eher einen leeren String zurückgeben, wenn das Problem tatsächlich nur in "keine Daten vorhanden" besteht.



  • Hallo, da bin ich wieder.

    Ich habe leider noch nicht wirklich aktiv mit dem Debugger gearbeitet (was wohl spätestens jetzt der Zeitpunkt wäre, es zu lernen).
    Da habe ich aber noch Probleme:
    Ich benutze das Eclipse IDE für C/C++ Version Helios Release 2

    Ich habe mir eine eigene make-Datei geschrieben, da die Quelldateien in verschiedenen Verzeichnissen liegen.
    Wird beim kompilieren jetzt meine make-Datei benutzt oder eine von Eclipse?

    Wenn ich per Shell make aufrufe, funktioniert das Kompilieren, bei Eclipse kommt jedoch der Error, dass ich zwei main-Funktionen habe (einmal client und einmal den server), wobei ich in der make-Datei es so eingestellt habe, dass nur der server kompiliert werden soll.
    Bevor ich den Debugger nutzen kann, sollte dies doch funktionieren...



  • Ok, konnte das make-File jetzt einbinden und versuche den Debugger zu starten.
    Setze einen Breakpoint in die Run()-Methode der ClientConnection, doch es kommt ein Fehler, mit dem ich nichts anfangen kann:

    Der Debug-Modus aktiviert, aber dann kommt eine Meldung:

    No source available for "main() at 0x4049c2"
    

    Was bedeutet das?



    1. Du hast die Sourcefile geändert, seitdem du das Programm mit Debuginformationen übersetzt hast.
    2. Du hast die main() nicht mit Debuginformationen übersetzt.
    3. Du hast irgendein Framework, und die main() befindet sich garnicht in deinem Code.


  • Mal ne kleine Zwischenfrage - kann Boost kein select() 😕



  • cooky451 schrieb:

    Mal ne kleine Zwischenfrage - kann Boost kein select() 😕

    Google kennst du?
    boost::asio::async_* aufrufen.



  • Entschuldige, dass ich mich jetzt erst wieder melde, war eine Woche nicht da.

    pumuckl schrieb:

    1. Du hast die Sourcefile geändert, seitdem du das Programm mit Debuginformationen übersetzt hast.
    2. Du hast die main() nicht mit Debuginformationen übersetzt.
    3. Du hast irgendein Framework, und die main() befindet sich garnicht in deinem Code.

    Wenn ich auf den Knopf "Debug client" drücke, wird das Makefile erneut ausgeführt und die Dateien mit den Breakpoints (ich hoffe doch, du meinst dies mit Debuginformationen) kompiliert, somit kann ich also den Sourcecode nicht nach Kompilierung ändern.

    Und ob ich ein Framework benutze... ich denke nicht, jedenfalls nicht bewusst, da ich nicht genau weiß, was das ist.

    Edit:
    Im Compiler wird jetzt genau die Zeile, die ich als Breakpoint-Markierung gesetzt habe, als Fehler angezeigt.
    Der Fehler ist:

    Multiple markers at this line
    	- Breakpoint attribute problem: installation 
    	 failed
    	- Line breakpoint: ClientConnection.cpp [line: 
    	 17]
    


  • Probier mal alle Breakpoints zu löschen (idealerweise über eine "Lösche alle Breakpoints" Funktion der IDE), und dann neu zu setzen.


Anmelden zum Antworten