Winsocket/Thread benötigt Funktionsaufruf

spooooongq

Grünschnabel
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:
#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:
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
 
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.
 
Vielen vielen Dank.
Für diejenigen mit gleichem Problem:
Code:
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
 

Neue Beiträge

Zurück