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.
-
Ach? Nach was suchst du denn?
-
drakon schrieb:
Ach? Nach was suchst du denn?
Nach Theard
-
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.htmlGruß,
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^^