Socketprogrammierung



  • Gibt es keine andere möglichkeit ausser des mit den Theard's?
    Und was ist jetzt zum Thema Autostart: Platform für Windows XP, Vista und für 7.



  • Deyta schrieb:

    Gibt es keine andere möglichkeit ausser des mit den Theard's?

    Es gibt ne Alternative zu ThReads, aber die ist wesentlich komplizierter...

    Deyta schrieb:

    Und was ist jetzt zum Thema Autostart: Platform für Windows XP, Vista und für 7.

    Falsches Forum...
    Ich vermute mal du kannst dazu nen Eintrag in der Registrierung anlegen.



  • Find aber keine Einführung zu ThReads auf Deutsch. 😞







  • Boah die Thread Scheiße ist noch zu kompliziert für mich als "Anfänger" da blick ich nicht durch..

    Wo ich was einsetzen muss und wieviele Threads ich brauch u.s.w. vllt könntet ihr mir ne Starthilfe geben?! 😛



  • Delta- schrieb:

    Wo ich was einsetzen muss und wieviele Threads ich brauch u.s.w. vllt könntet ihr mir ne Starthilfe geben?! 😛

    CSpille schrieb:

    Wenn du mehrere Client-Anfragen mit einem blocking socket gleichzeitig verarbeiten möchtest, wirst du für jede eingehende Verbindung einen neuen Thread starten müssen.

    do {
    connectedSocket=accept(acceptSocket,NULL,NULL);
    startThread(connectedSocket);
    while(connectedSocket!=INVALID_SOCKET)
    


  • evtl. ist ein bischen am thema vorbei, aber den text fand ich ganz nett auch wenns englisch ist, aber das meißte ist eh code und der sollte doch eh in englisch sein oder 😉 http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=/rzab6/rzab6xnonblock.htm

    btw. ohne die kommentare ists auch nicht so lang...

    lg lolo



  • @CSpille Was muss ich für die Funktion startTheard einbinden?



  • Delta- schrieb:

    Find aber keine Einführung zu ThReads auf Deutsch. 😞

    Wenn du dich ernsthaft mit der Programmierung beschäftigen willst, wirst du nicht drumrumkommen englisch zu lernen. Es gibt viele Englische und wenige Deutsche Seiten zu den jeweiligen Themen, die meisten sind mittelmäßig und nur wenige wirklich gut und umfassend. Zu einem bestimmten Thema eine deutsche Seite zu finden, die alles gut und erschöpfend erklärt, ist also mehr als unwahrscheinlich. Deshalb: lerne Englisch.

    Delta- schrieb:

    Boah die Thread Scheiße ist noch zu kompliziert für mich als "Anfänger" da blick ich nicht durch..

    Du hast dir für einen Anfänger ein recht komplexes Thema ausgesucht. Wenn du dabei bleiben willst musst du da wohl durch.



  • Hi,

    eigentlich wollte ich dir gerade folgenden Link als Hinweis geben mit ein
    paar deutschen Erläuterungen.
    http://stackoverflow.com/questions/86046/best-way-to-start-a-thread-as-a-member-of-a-c-class
    Allerdings bin ich jetzt etwas verwirrt, da ich glaube,
    dass der folgende Code, obwohl er hoch bewertet wurde, nur sehr begrenzt
    tauglich ist.

    #include <boost/function.hpp>
    #include <boost/thread.hpp>
    
    class cMyClass
    {
    public:
    void Run();
    }
    
    cMyClass theClass;
    
    // start new thread by invoking method run on theClass instance
    
    boost::thread* pThread = new boost::thread(
        boost::bind( 
        &cMyClass::Run,             // member function
        &theClass ) );              // instance of class
    

    Deswegen mal eine Frage in die Runde...
    Der Code funktioniert nur, solange garantiert ist, dass das cMyClass-Object
    dauerhaft lebt, oder sehe ich das falsch?
    (Eventuell auch solange keine Felder und virtuellen Methoden vorhanden sind,
    aber ich würde nicht erwarten, dass der Standard das garantiert)
    Es wird doch nur eine Kopie des boost::bind-Objektes erstellt und die Zeiger
    verweisen auf einen Speicherberich, der später ungültig wird / werden kann.
    Generell würde ich das Beispiel einfach als nicht tauglich für eine variable
    Anzahl von Threads einstufen, jedoch frag ich mich dann warum es so gut
    bewertet ist...

    Mir ist klar, dass ich zur Verwendung von boost::thread einfach ein Object
    erstellen kann, das einen Copy-Konstrukor hat und den operator()
    implementiert, welches ich dann als Parameter übergebe.

    Gruß,
    CSpille



  • Hi Delta-,

    da muss ich pumuckl absolut recht geben...

    Trotzdem werde ich versuchen dir nochmal mit einem allgemeinen Beispiel
    zu helfen:

    Für Boost kannst du dir mal folgendes einfaches Beispiel ankucken:

    CountingThread.h:

    class CountingThread{
    public:
    	CountingThread(int f, int u);
    
    	void operator()();
    
    private:
    	int from;
    	int until;
    }
    
    void startCounter(int from, int until);
    

    CountingThread.cpp:

    #include <boost/thread.hpp>
    #include <iostream>
    
    CountingThread::CountingThread(int f, int u) : from(f), until(u) {}
    
    // Diese Methode wird aufgerufen, wenn der neue Thread gestartet wird.
    void CountingThread::operator()(){
    	for(int i=f; i<u; ++i){
    		std::cout << i << std::endl;
    	}
    }
    
    void startCounter(int from, int until){
    	//Hier wird ein Objekt erstellt, das den operator() als Einstieg
    	// für den neuen Thread  haben muss
    	CountingThread countingThread(from, until); 
    	//Dieser Befehl dient dem Starten eines neuen Threads, dabei wird das
    	//Objekt per Kopier-Konstruktor kopiert -> keine Zeiger oder Referenzen in
    	//das Objekt, die in dem Code nach diesem Befehl ungültig werden
    	boost::thread thread(countingThread);
    }
    

    Der Code ist ungetestet und ohne Garantien 😉
    und hoffentlich sind nicht zuviele Fehler drin ^^

    Für die native Windows-Version kannst du dir mal den Beitrag von Fux in folgenden
    Thread durchlesen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39508.html

    Gruß,
    CSpille



  • CSpille schrieb:

    boost::thread* pThread = new boost::thread(
        boost::bind( 
        &cMyClass::Run,             // member function
        &theClass ) );              // instance of class
    

    Diese Zeile produziert natürlich auch noch nen memory leak, wie mir
    gerade erst auffällt...



  • Aber die Klasse "ContuningThread" ergibt doch keinen Sinn, oder?



  • Ich wollte dir nicht die exakte Lösung posten, da der Lerneffekt sonst 0 wäre...

    Wenn du anstelle der zwei Zahlen deinen acceptedSocket übergibst
    und statt dem Zählen im operator() deine Eingaben von den Clients empfängst
    und behandelst, hast du schon genau, was du willst...



  • BTW: boost::thread hat move semantik... nur als Hinweis.



  • theta schrieb:

    BTW: boost::thread hat move semantik... nur als Hinweis.

    Was heißt "hat move semantik"?

    Beziehst du dich auf diesen Teil der boost-Doku:

    Objects of type boost::thread are movable, however, so they can be stored in move-aware containers, and returned from functions. This allows the details of thread creation to be wrapped in a function.

    http://www.boost.org/doc/libs/1_37_0/doc/html/thread/thread_management.html

    Ehrlich gesagt, weiß ich nicht, wie ich den Kommentar jetzt einordnen soll...





  • Ehrlich gesagt, weiß ich nicht, wie ich den Kommentar jetzt einordnen soll...

    Ich habs nur erwähnt, weil ich gesehen habe, dass im ersten Bsp. ein boost::thread Objekt auf dem Heap angelegt wurde, was in den meisten Fällen unnötig ist.

    War, jetz wo ich alles lese, ein wenig am Ziel vorbei.

    Simon



  • Ich schätze deine Geduld aber bin in C++ neu 😞
    Hab mir jetzt gedacht: "Ok, ne Schleife wäre ja das logischte."
    mit dem Code hier:

    do {
            connectedSocket=accept(acceptSocket,NULL,NULL);
            //Thread.Start(connectedSocket);
    
        if(connectedSocket==INVALID_SOCKET)
    
        {
                                           cout << "Fehler: accept!" << endl;
        }
        else
        {
            cout << "Neue Verbindung!" << endl;
        }
    }while(connectedSocket!=INVALID_SOCKET);
    

    Der klappt perfekt!
    Doch dann häng ich für immer in der Schleife fest 😛
    Deswegen ja diese Thread Funktion
    Aber kappiere immernoch nicht wie das funktioniert mit dem Thread..
    Das man sagt "Wiederhole diese Schleife im Hintergrund die ganze zeit, und ich mach weiter mit dem nächsten Code" Aber verstehe ned welche Threadfunktion das macht und welche header datei ich dazu einbinden muss das die Funktion schon deklariert ist.
    Ich werd mir diesen Beitrag nach ein Jahr anschauen und mich schämen, das ich so ne sinnlose scheiße schreibe^^


Anmelden zum Antworten