1Danke
ERLEDIGT
JA
JA
ANTWORTEN
2
2
ZUGRIFFE
299
299
EMPFEHLEN
-
29.03.11 21:54 #1
- 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
-
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.
-
30.03.11 13:58 #3
- 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
-
[WinSocket] Ein einfaches Beispiel
Von Tobias K. im Forum C/C++Antworten: 13Letzter Beitrag: 17.02.05, 17:23 -
WinSocket Fehler #10061
Von first_chris im Forum Microsoft WindowsAntworten: 0Letzter Beitrag: 12.01.05, 10:03 -
Winsocket Fragen
Von moistwanted im Forum C/C++Antworten: 6Letzter Beitrag: 22.10.04, 21:10 -
Winsocket per ocx File
Von Cthulhu im Forum Visual Basic 6.0Antworten: 6Letzter Beitrag: 21.07.04, 09:19 -
max - c4d (Thread split by IKEAFREAX on 09.07.2002 23:43 (thread by pasq))
Von pasq im Forum 3D Studio MaxAntworten: 19Letzter Beitrag: 12.07.02, 11:13





Zitieren
Login






