tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Endurion
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
299
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    spooooongq spooooongq ist offline Mitglied
    Registriert seit
    Jun 2009
    Beiträge
    16
    Hallo,
    ich habe ein großes Problem und Ich wende mich an euch, damit ihr mir eventuell helfen könnt.
    Kurz umschrieben: Nach CreateThread benötige ich einen Funktionsaufruf mit Messagebox, da mir mein Programm sonst abstürzt (Mit beendet es wunderbar).Nur bleibt die Frage: Warum? Compilen lässt sich beides ohne Fehler.

    Folgender Quelltext:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    #include "header.h"
    #include <windows.h>//und winuser.h, winsock.h, iostream
     
     
    string mb(string arg){
    Messagebox(NULL,arg.c_str(),"title",0);
    return "";
    }
     
    int WINAPI WinMain(...){
    //auskommentiert, ich bin sicher das tut
    mystruct m;
    m = &mb;//mb ist eine funktion mit MessageBox aufruf
     
    m.mb("test1");
    m.newThread(sock);
    //auskommentiert
    return 0;
    }

    und die Datei header.h
    Code :
    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
    
    typedef string (*MessageBoxFunc)(string);
    struct mystruct {
        void newThread(SOCKET sock);
        MessageBoxFunc mb;
     
    }
    struct Pair {
        mystruct m;
        SOCKET sock;
    }
    void mystruct::newThread(SOCKET sock){
        HANDLE hThread;
        Pair p;
        p.m = *this;
        p.sock = sock;
        DWORD dwThreadID;
        hThread = CreateThread( NULL,
                              0,
                              ThreadFunc,
                              &p,
                              0,
                              &dwThreadID
                              );
        this->mb("test2");//es geht um diesen benötigten Funktionsaufruf
        return;
    }
     
    DWORD WINAPI ThreadFunc(LPVOID data){
        Pair* params = reinterpret_cast<Pair*>(data);
        mystruct m = params->m;
        SOCKET sock = params->sock;
        m.mb("test3");
        return((DWORD)data);
    }

    Für weitere benötigten Daten/Antworten einfach fragen.

    Achja:
    OS: WinVista
    IDE: CodeBlocks 10.05
    compiler:gnucc


    Vielen Dank im Vorraus!

    Spooooongq

    Edit: Winsockets sind in der Threadfunktion und in der WinMain
     

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Eigentlich einfach, aber deshalb ist Thread-Programmierung auch nichts für Unbedarfte.

    Während deine ThreadFunc anspringt, ist deine Funktion newThread fertig und p fällt aus dem Scope. ThreadFunc ist noch fleißig am arbeiten und greift auf params zu, welches auf inzwischen vergangenen Speicher zeigt.

    Am besten alloziierst du Speicher für das Pair struct, gibst den Pointer an ThreadFunc, welches das Pair benutzt und dann freigibt.
    spooooongq bedankt sich. 

  3. #3
    spooooongq spooooongq ist offline Mitglied
    Registriert seit
    Jun 2009
    Beiträge
    16
    Vielen vielen Dank.
    Für diejenigen mit gleichem Problem:
    Code :
    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
    
    void mystruct::newThread(SOCKET sock){
        HANDLE hThread;
        DWORD dwThreadID;
        Pair *buf = (Pair*)malloc(sizeof(Pair));
        buf->s = *this;;
        buf->sock = sock;
        this->threadsAlive = true;
        hThread = CreateThread( NULL,
                              0,
                              ThreadFunc,
                              buf,
                              0,
                              &dwThreadID
                              );
        this->mb("test2");//es geht um diesen benötigten Funktionsaufruf
        return;
    }
     
    DWORD WINAPI ThreadFunc(LPVOID data){
        Pair* params = reinterpret_cast<Pair*>(data);
        mystruct m = params->m;
        SOCKET sock = params->sock;
        free(data);
        m.mb("test3");
        return((DWORD)data);
    }

    hoffe, das das so Richtig war, wenn nicht, tut es trotzdem

    Mit vielen dankenden Grüßen

    Spooooongq
     

Ähnliche Themen

  1. [WinSocket] Ein einfaches Beispiel
    Von Tobias K. im Forum C/C++
    Antworten: 13
    Letzter Beitrag: 17.02.05, 17:23
  2. WinSocket Fehler #10061
    Von first_chris im Forum Microsoft Windows
    Antworten: 0
    Letzter Beitrag: 12.01.05, 10:03
  3. Winsocket Fragen
    Von moistwanted im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 22.10.04, 21:10
  4. Winsocket per ocx File
    Von Cthulhu im Forum Visual Basic 6.0
    Antworten: 6
    Letzter Beitrag: 21.07.04, 09:19
  5. Antworten: 19
    Letzter Beitrag: 12.07.02, 11:13

Stichworte