Hallo. Ich hab ein Prograemmchen mit VC.NET geschrieben, das bis vor der Einfuehrung von Threads problemlos funktionierte.
Ich bekomme immer eine Nullpointer-Exception und zwar liest ein Befehl die Adresse 0x0. Keine ahnung warum.
Die Klasse sieht ungefaehr so aus :
(host.h)
class host {
static HANDLE boeserThread;
static DWORD boeseThreadFunktion(LPVOID bla);
static void callbackFunktion(DWORD bla, DWORD blabla, ...);
host();
~host();
}
(host.cpp)
host::host()
{
host::boeserThread = CreateThread(blablabla...);
//Thread wird erfolgreich erzeugt
}
DWORD host::boserThreadFunktion(LPVOID bla)
{
//Diese Funktion wird erfolgreich aufgerufen, erzeugt einen OVERLAPPED Socket
SOCKET meinSocket = WSASocket(AFINET, SOCK\_DGRAM, WSA\_FLAG\_OVERLAPPED);
//Jetzt wird auf dem Socket ein packet gesendet, OVERLAPPED
WSASendTo(..., ..., ..., &host::callbackFunktion);
//Diese Funktion liefert einen SOCKET\_ERROR, was nach Dokumentation auch OK ist
//Nach einem WSAGetLastError() kommt als Fehlermeldung ein WSA\_IO\_PENDING zurueck, was bedeutet, dass der letzte Befehl ausgefuehrt wird und dann die Funktion "callbackFunktion" aufgerufen wird (angegeben in WSASendTo). Allerdings kann die "callbackFunktion" nicht aufgerufen werden, wenn der Thread nicht angehalten wird, also rufe ich ein :
SleepEx(200, true);
//auf, was bedeutet der Thread soll warten. 200 millisekunden, oder bis eine callbackFunktion aufgerufen wird ("callbackFunktion")
//Das Programm spring jetzt in die "callbackFunktion", arbeitet die Befehle ab, und stuerzt dann mit einer "Lesen von Adresse 0x0"-Fehlermeldung ab. Angeblich nach "SleepEx(200, true);". Der Assemblercode bring auch nix interessantes zutage...
}
host::callbackFunktion(...)
{
cout
Ohne Threads oder mit einem Sleep(200); geht alles problemlos, alldings wird dann die "callbackFunktion" auch nich aufgerufen.
Hilfe sehr wilkommen! :smile:
KIM