tutorials.de Buch-Aktion 05/2012
Like Tree4Danke
  • 1 Beitrag von Muepe32
  • 1 Beitrag von deepthroat
  • 1 Beitrag von Muepe32
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
13
ZUGRIFFE
322
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    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
    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);
    }
    }
    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?


    Grüße July
    Geändert von july (29.06.11 um 08:25 Uhr)
     

  2. #2
    Avatar von Muepe32
    Muepe32 Muepe32 ist offline Mitglied Brokat
    Registriert seit
    Mar 2011
    Beiträge
    353
    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?
    july bedankt sich. 
    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!

  3. #3
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo,

    die Thread-Funktion ist schon ein Zeiger, den Adressoperator '&' solltest du nicht benötigen:
    Code :
    1
    
    pthread_create(&p_thread, NULL, receive_thread,(void*)&sock);
    Die Thread-Funktion als ' extern "C" ' zu deklarieren ist meines Erachtens auch nicht notwendig.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  4. #4
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    auch ohne extern "C"{} stürzt das programm ab...
     

  5. #5
    Avatar von Muepe32
    Muepe32 Muepe32 ist offline Mitglied Brokat
    Registriert seit
    Mar 2011
    Beiträge
    353
    Zitat Zitat von Muepe32 Beitrag anzeigen
    In welcher Zeile stürzt dein Programm denn ab?
    Bitte immer alle Fragen beantworten
     
    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!

  6. #6
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    Zitat Zitat von Muepe32 Beitrag anzeigen
    Bitte immer alle Fragen beantworten
    Die Frage würd ich gern beantworten, kann ich aber nicht, weil ich eclipse cdt mit MinGW benutze, unterstützt gdb leider Threads nicht bzw. kann ich nicht debuggen sobald da eine Threadfunktion vorkommt, in manchen Foren hab ich gelesen, dass es ein gdb-Bug ist...
     

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von july Beitrag anzeigen
    Die Frage würd ich gern beantworten, kann ich aber nicht, weil ich eclipse cdt mit MinGW benutze, unterstützt gdb leider Threads nicht bzw. kann ich nicht debuggen sobald da eine Threadfunktion vorkommt, in manchen Foren hab ich gelesen, dass es ein gdb-Bug ist...
    Also ich hab damit keine Probleme. (\edit: mit GDB, Eclipse verwende ich nicht)

    Poste doch bitte mal den vollständigen Code (als Anhang). Dann schau ich's mir mal an.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #8
    Avatar von Muepe32
    Muepe32 Muepe32 ist offline Mitglied Brokat
    Registriert seit
    Mar 2011
    Beiträge
    353
    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!

  9. #9
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    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;
    ...
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von july Beitrag anzeigen
    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)
    ...
    }
    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
    july bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    Avatar von Muepe32
    Muepe32 Muepe32 ist offline Mitglied Brokat
    Registriert seit
    Mar 2011
    Beiträge
    353
    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.
    july bedankt sich. 
    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!

  12. #12
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    hab jetzt geändert, danke für den Tipp.

    Grüße July
     

  13. #13
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Nachtrag zu Pthreads: Kann es sein, dass du einfach vergessen hattest pthread_init() aufzurufen?
    july bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  14. #14
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    jep, hab ich :/
    Danke.
     

Ähnliche Themen

  1. Ubuntu + Eclipse + pthread_create= PROBLEM
    Von devilmc im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 20.04.10, 12:35

Stichworte