Struktur als Parameter an Thread übergeben
-
Meinst du irgendwie sowas:
MeshLoaderParam *m = new MeshLoaderParam; m->mesh = mesh; .....
-
Yeahh ich habs hinbekommen.Für alle mit dem gleichen Problem:
DWORD WINAPI G6_Engine::MeshLoader(LPVOID param) { MeshLoaderParam *c = reinterpret_cast<MeshLoaderParam*>(param); std::string temp_name(c->path); MessageBoxA(0,temp_name.c_str(),0,0); return 0; } bool G6_Engine::GFileManager::Load(GMesh* mesh, std::string path) { HANDLE Temp_h = NULL; //Temp Handle für Thread DWORD Temp_d = NULL; //Temp Dword für Thread MeshLoaderParam* a = (MeshLoaderParam*) malloc(sizeof(a)); new (a) MeshLoaderParam(); a->mesh = mesh; a->path = path; Temp_h = CreateThread(NULL, 0 ,(LPTHREAD_START_ROUTINE) MeshLoader,reinterpret_cast<LPVOID>(a), NULL, NULL); GetExitCodeThread(Temp_h, &Temp_d); //In dem Dword wird der Zustand gespeichert _ThreadMap.insert( std::make_pair<HANDLE , DWORD>(Temp_h,Temp_d)); //Setze den Thread in die map ein return false; }Man erstellt erstmal einen Speicherbereich für die Struktur und dann erstellt man mit new eine Instanz davon.Jetzt kann man das ganze ausfüllen und mit reinterpret_cast casten.In dem Thread einfach zurück und man hats
-
Bob Wolfskin schrieb:
Meinst du irgendwie sowas:
MeshLoaderParam *m = new MeshLoaderParam; m->mesh = mesh; .....Zum Beispiel. (
deletenicht vergessen!)
-
Fehlt nur noch eines
DWORD WINAPI G6_Engine::MeshLoader(LPVOID param) { MeshLoaderParam *c = reinterpret_cast<MeshLoaderParam*>(param); std::string temp_name(c->path); MessageBoxA(0,temp_name.c_str(),0,0); [b]delete c;[/b] // kann in der aufrufenden funktion nicht freigegeben werden return 0; }Kurt
-
Bob Wolfskin schrieb:
MeshLoaderParam* a = (MeshLoaderParam*) malloc(sizeof(a)); new (a) MeshLoaderParam();malloc(sizeof(a))und placement new
Du reservierst lediglich Platz für einen Zeiger.
Mach's so, wie Du selbst eben vorschlugst.
MeshLoaderParam* a = new MeshLoaderParam;
-
malloc(sizeof(a)) und placement new
Du reservierst lediglich Platz für einen Zeiger.
Ja so ist das und es funktioniert einwandfrei

Der Fehler war ja, dass kein Speicherplatz freigegeben wurde und deshalb ein Fehler beim Aufruf die Folge war
-
Bob Wolfskin schrieb:
Ja so ist das und es funktioniert einwandfrei

Das denkst Du nur.
MeshLoaderParamist größer als ein Zeiger. Du zerschießt dir den Heap. Das kann dir jederzeit um die Ohren fliegen.
Warum placement new wenn Du doch nur einnewwillst?
-
Okey ich habs jetzt umgeschrieben, vielen Dank.
Übrigens wenn ich in der Threadfunktion meine instanz mit delete am Ende lösche bricht das Program zusammen.
Wie kann das sein?
-
Okey machts doch nicht, war nur beim placement new so

Vielen Dank für die Antworen
-
Bob Wolfskin schrieb:
Okey machts doch nicht, war nur beim placement new so

malloc() <-> delete => bumm!