Thread Problem
-
bekomme nur ne fehlermeldung wenn der configure neu schreibt...
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for C++ compiler default output file name...
configure: error: C++ compiler cannot create executables
See `config.log' for more details.
*** Beendet mit Status: 77 ***aber weiß nich ob es damit etwas auf sich hat, habe bei compileraufruf CXX lpthread eingetragen... mit -lpthread das gleiche und mit nur pthread auch der fehler...
-
Wo hast du das denn eingetragen? Die richtige Option ist -pthread
-
unter projekte->projekt einstellungen->einstellungen für configure und dann c++ hab ich jetzt -pthread eingetragen und der fehler ist immernoch da.
-
snoopdog schrieb:
unter projekte->projekt einstellungen->einstellungen für configure und dann c++ hab ich jetzt -pthread eingetragen und der fehler ist immernoch da.
Das gehört dort nicht hin. Du mußt beim Automake-Manager für dein Target diese Option hinzufügen, oder beim QMakeManager, wenn du den benutzt.
-
und wo finde ich das feld wo ich es eintragen muss??
[edit]
habs gefunden unten rechts nen menü aufklappen..
dann hab ich auf mein projekt geklickt rechte maustaste einstellungen und dann auf biblotheken...dort habe ich dann -lpthread eingetragen. dann autoconf & konsorten ausgeführt und programm wieder gestartet... gleicher fehler...
mit -pthread kommt nen fehler beim autoconf...
-
snoopdog schrieb:
und wo finde ich das feld wo ich es eintragen muss??
Im Automake Manager auf das Target gehen, hat oft hinten ein (Programm in bin). dann auf Einstellungen und bei den Linkerschaltern -pthread eintragen.
-
habe ich probiert... der speicherzugriffsfehler besteht immernoch...
-
snoopdog schrieb:
habe ich probiert... der speicherzugriffsfehler besteht immernoch...
Hmm, kannst du mal dein Programm einfach mal selbst kompilieren und schauen was dann passiert? Dann solltest du mal dein Programm durch Valgrind laufen lassen und mal schauen, wo es genau abstürzt.
-
kannst du mir sagen wie ich mit gcc mehrere cpp und header dateien compiliere ? oder muss ich mir erst ne makedatei erstellen ?? hab bisher immer mit kdevelop gearbeitet
-
Du kannst das natürlich auch über einzelne gcc-Aufrufe machen, dass ist aber natürlich aufwendig.
Eine Makefile musst du nicht unbedingt schreiben, dafür gibt es die ultimative Makefile, die du nur noch ein wenig anpassen musst.
-
habe grade etwas ausprobiert.. ein neues Projekt erstellt was nur nen hallo ausgibt... die biblotheken bei kdevelop eingebunden und es klappt einwandfrei...
das gleiche bei meinem projekt getan und es klappt nichts, hier mal die komplette Fehlermeldung.
/bin/sh: line 1: 22915 Speicherzugriffsfehler ./gameservermanager
Betätigen Sie die Eingabetaste, um fortzufahren!
-
z.B.
g++ -I/include -L/libs -lpthread /src/foo.cpp /usr/include/bar.cpp -o TestProgrammMichael
-
so also ich habe es grade irgendwie hinbekommen das ich keinen Speicherzugriffsfehler mehr habe. weiß aber nicht genau wieso... aber es klappt, das komische ist nur da nix ausgeben wird...
void *WarteAufAnfrage(void *name) { //int i; sleep(10000); printf("%s",name); } int main(int argc, char *argv[]) { pthread_t WarteThread; //pthread_attr_t attr; //pthread_attr_init(&attr); //pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); pthread_create(&WarteThread,NULL,WarteAufAnfrage,(void *)"hallo"); pthread_join(WarteThread,NULL)
so er müsste ja jetzt 10 sekunden warten bis er was ausgibt...
habe die zeit mal genutzt und mir alle prozesse angezeigt mit ps aux..
da wa einmal ./gameserver und nochmal ./gameserver ; echo"Bestätigen mit Taste..."also so als wenn der Thread sich sofort beendet...
-
weiß keiner rat oder wurd der letzte post von mir übersehen??
wäre nett wenn ihr mir nochmal dabei helfen könntet.
-
poste nochmal den gesamten Code, so dass man ihn selbst kompilieren könnte und den verwendeten kompileraufruf.
-
also der ganze code sind insgesamt drei dateien...aber ich poste mal den code der main funktion...
void *WarteAufAnfrage(void *name) { //int i; sleep(10000); printf("%s",name); } int main(int argc, char *argv[]) { pthread_t WarteThread; //pthread_attr_t attr; //pthread_attr_init(&attr); //pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); pthread_create(&WarteThread,NULL,WarteAufAnfrage,(void *)"hallo"); pthread_join(WarteThread,NULL); CMySocket *pMySocket; pMySocket = new CMySocket; pMySocket->CreateServer(1500); int clients[10]; fd_set fdSet; int b; int rc; char *buffer; buffer = new char[1024]; for(b=0;b<10;b++) { clients[b]=0; } while(1) { FD_ZERO(&fdSet); FD_SET(pMySocket->ServerSocket,&fdSet); for(b=0;b<10;b++) { if(clients[b]!=0) { FD_SET(clients[b],&fdSet); } } select(11,&fdSet,NULL,NULL,NULL); if(FD_ISSET(pMySocket->ServerSocket,&fdSet)) { for(b=0;b<10;b++) { if(clients[b]==0) { clients[b]=accept(pMySocket->ServerSocket,NULL,NULL); printf("Neuer Client verbunden\n"); break; } } } for(b=0;b<10;b++) { if(clients[b]==0) { continue; } if(FD_ISSET(clients[b],&fdSet)) { buffer = new char[1024]; //buffer = pMySocket->SocketRecv(clients[b]); rc = recv(clients[b],buffer,1024,0); //rc = pMySocket->SocketRecv(clients[b]); printf("%s\n",buffer); if(rc<=0) { printf("Client %d hat die Verbindung beendet\n",b); close(clients[b]); clients[b]=0; FD_CLR(pMySocket->ServerSocket,&fdSet); delete [] buffer; } else { /* char *status,*game,*port,*map,*maxplayers,*servername; char *serveroption[5]; int a; ptr = strtok(buffer,"#"); status = ptr; for(a=0;a<5;a++) { ptr = strtok(NULL,"#"); serveroption[a] = ptr; } game = serveroption[0]; servername = serveroption[1]; port = serveroption[2]; map = serveroption[3]; maxplayers = serveroption[4]; printf("%s..%s...%s...%s..%s\n",game,servername,port,map,maxplayers); if(strcmp(status,"01")==0) // Server starten { if(strcmp(game,"01")==0) //CS 1.5 Server { if(openCounterStrikeServer15(port,map,maxplayers,servername)==1) { printf("CS Server gestartet\n"); send(clients[b],"01\0",10,0); } else { printf("Fehler beim starten des CS Servers\n"); send(clients[b],"00\0",10,0); } } } delete [] buffer;*/ } } } } }
in den zwei anderen dateien ist die klasse mysocket deklariert...
theoretisch müsste ja ein hallo ausgegeben werden, nur leider wird es das nicht... der rest des programms geht auch nicht... d.h. es kann sich kein client übers netzwerk im server einloggen. Also so als wenn der Thread alles blockt und sich das programm "aufhängt"
-
Der folgende Code funktioniert hier:
extern "C" { #include <pthread.h> #include <unistd.h> } #include <cstdio> void *WarteAufAnfrage(void *name) { //int i; sleep(10); printf("%s\n",name); } int main(int argc, char *argv[]) { pthread_t WarteThread; //pthread_attr_t attr; //pthread_attr_init(&attr); //pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); pthread_create(&WarteThread,NULL,WarteAufAnfrage,(void *)"hallo"); pthread_join(WarteThread,NULL); }
sleep nimmt die anzahl der sekunden und nicht der milisekunden.
Das ganze habe ich mit
g++ -pthread datei.C
kompiliert.
Geh mal in das src verzeichnis und mach ein "make". Dann siehst du was der kompiler wirklich ausfuehrt. ansonsten kannst du im irc nochmal fragen. zum beispiel #c++.de ueber irc.fu-berlin.de
-
Bist Du sicher das accept mit NULL,NULL geht?
snoopdog schrieb:
clients[b]=accept(pMySocket->ServerSocket,NULL,NULL);
Sollte das nicht so:
socklen_t len=(socklen_t)sizeof(newConnection.addr); newConnection.socket=accept(acceptSocket,(struct sockaddr*)&newConnection.addr,&len);
aussehen?
Und ich glaube ich habe das selbe Tutorial zur Socketprogrammierung benutzt wie du..:-) ; mein Code sieht fast genauso aus.
Gruß
Michael