4Danke
ERLEDIGT
JA
JA
ANTWORTEN
13
13
ZUGRIFFE
322
322
EMPFEHLEN
-
Hallo zusammen,
ich möchte gern nach der Kommunikationsherstellung paar neue Threads bei meinem Programm starten
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
do{ rc = listen(acceptSocket, 10); if (rc == SOCKET_ERROR) { cout << "Fehler: listen, fehler code:" << WSAGetLastError() << endl; return 1; } else { cout << "acceptSocket ist im listen Modus...." << endl; sock = accept(acceptSocket, NULL, NULL); if (sock == INVALID_SOCKET) { cout << "Fehler: accept, fehler code: " << WSAGetLastError() << endl; return 1; } else { cout << "Neue Verbindung wurde akzeptiert!" << endl; pthread_create(&p_thread, NULL, &receive_thread,(void*)&sock); Sleep(1); } } } while (1);
leider geht's mit pthread_create() nicht so einfach. Ich hab schon vieles mit dem Funbktionspointer ausprobiert und bin bei der Lösung stehen geblieben
Das Problem an der Lösung ist, dass hier der Compiler zwar nicht meckert, aber das Programm stürzt sofort ab. Habt ihr vielleich eine Idee wier man das lösen kann?Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
extern "C" { void *receive_thread(void *sock){ char msg_buf[10000]; Connection con; message_t msg; con.receive_message((SOCKET *)sock, msg_buf, &msg); cout << "server get message"<<endl; cout<< msg.clientId<<endl; //ueberprüfen ob die Meldung an dem richtigen Empfaenger gelandet ist switch(msg.nachArt) { case FEUER: break; case STOERUNG: break; case ABSCHALTUNG: break; case SONSTIGES: break; case RESET: break; case STATUS: break; case STATUSENDE: break; default: break; } return (0); } }
Grüße JulyGeändert von july (29.06.11 um 08:25 Uhr)
-
Wenn ich mich recht entsinne aus vorherigen Postings verwendest du ja aktiv Windows. Da kannst und solltest du eigentlich die Funktion CreateThread verwenden. Alternativ bietet sich auch die Möglichkeit an boost::thread in Betracht zu ziehen, da du da dann alles in einem hast.
In welcher Zeile stürzt dein Programm denn ab?Viele Tutorials und Artikel zur Programmierung unter Windows mit C++ und C#. Tägliche Updates und Antworten auf eure Fragen:
Win32Easy - Blog
Es würde mich freuen, wenn ihr einen Kommentar postet!
-
Hallo,
die Thread-Funktion ist schon ein Zeiger, den Adressoperator '&' solltest du nicht benötigen:
Die Thread-Funktion als ' extern "C" ' zu deklarieren ist meines Erachtens auch nicht notwendig.Code :1
pthread_create(&p_thread, NULL, receive_thread,(void*)&sock);
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
auch ohne extern "C"{} stürzt das programm ab...
-
Viele Tutorials und Artikel zur Programmierung unter Windows mit C++ und C#. Tägliche Updates und Antworten auf eure Fragen:
Win32Easy - Blog
Es würde mich freuen, wenn ihr einen Kommentar postet!
-
-
29.06.11 09:46 #7
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Entwickelst du auf einer non-Windows Plattform?
Ansonsten (falls also gdb wirklich nicht funktionieren sollte) am besten halt pseudomässig Schritt für Schritt durch dein Programm gehen à la:
Code cpp:1 2 3 4 5 6 7 8 9 10 11
void waitOne() { std::cin.sync(); std::cin.get(); } ... waitOne(); // einen Programmschritt machen waitOne(); // nächster Schritt waitOne(); ...
Viele Tutorials und Artikel zur Programmierung unter Windows mit C++ und C#. Tägliche Updates und Antworten auf eure Fragen:
Win32Easy - Blog
Es würde mich freuen, wenn ihr einen Kommentar postet!
-
Ich hab jetzt das Problem gelöst, in dem ich gemacht hab, was mir Muepe32 geraten hat und CreateThread benutzt hab.
Code cpp:1 2 3 4 5 6 7 8 9
main(){ ... thread_attr_t *attr; attr->zentralenId = zentralenId; attr->socket = &sock; h= CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)&receive_thread,(LPVOID)attr,0, NULL); Sleep(1) ... }
Code cpp:1 2 3 4 5
DWORD receive_thread(LPVOID attr){ ... thread_attr_t *tAttr = reinterpret_cast<thread_attr_t*>(attr); SOCKET *sock = tAttr->socket; ...
-
29.06.11 09:54 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Du solltest da auf keinen Fall den Funktionszeiger casten müssen. Im Fall von CreateThread mußt du die WINAPI Aufrufkonvention verwenden. Siehe http://msdn.microsoft.com/en-us/libr...36(VS.85).aspx
GrußGeändert von deepthroat (29.06.11 um 09:55 Uhr) Grund: falscher Link
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Das dürfte dann aber auch einen Laufzeitfehler erzeugen, wenn du nicht __stdcall als Standardkonvention verwendest. Es darf nie gecastet werden um Fehlermeldungen einfach zu entfernen
. LPTHREAD_START_ROUTINE ist ein Typ mit __stdcall als Aufrufkonvention.
Viele Tutorials und Artikel zur Programmierung unter Windows mit C++ und C#. Tägliche Updates und Antworten auf eure Fragen:
Win32Easy - Blog
Es würde mich freuen, wenn ihr einen Kommentar postet!
-
hab jetzt geändert, danke für den Tipp.
Grüße July
-
29.06.11 10:38 #13
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Nachtrag zu Pthreads: Kann es sein, dass du einfach vergessen hattest pthread_init() aufzurufen?
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
jep, hab ich :/
Danke.
Ähnliche Themen
-
Ubuntu + Eclipse + pthread_create= PROBLEM
Von devilmc im Forum C/C++Antworten: 6Letzter Beitrag: 20.04.10, 12:35





Zitieren
Login






