[C++] CreateThread
-
Hallo Leute,
ich habe ein Problem mit CreateThread. Erstmal mein Code:#include <iostream> #include <windows.h> using namespace std; typedef int MINUTE; typedef char* CREEP; struct Monster { CREEP RED_BUFF; CREEP BLUE_BUFF; CREEP DRAGON; CREEP BARON; } MONSTER = { "Red_Buff", "Blue_Bluff", "Dragon", "Baron" }; BOOL TIMER_ON = TRUE; struct Parameter { MINUTE min; CREEP c; DWORD ThreadID; HANDLE ThreadHandle; }; void Timer( Parameter p ); void SetTimer( MINUTE min, CREEP c ); DWORD ThreadID; void SetTimer( MINUTE min, CREEP c ) { Parameter PARMS; PARMS.min = min; PARMS.c = c; PARMS.ThreadHandle = CreateThread( NULL, NULL, ( LPTHREAD_START_ROUTINE )&Timer, &PARMS, 0, &ThreadID ); PARMS.ThreadID = ThreadID; } void Timer( Parameter p ) { cout << p.min << endl; cout << p.c << endl; cout << p.ThreadHandle << endl; cout << p.ThreadID << endl; DWORD start = GetTickCount( ); while ( TIMER_ON == TRUE ) { DWORD def = ( GetTickCount( ) - start ); if ( ( def ) >= ( p.min * 60 * 1000 ) ) { //cout << p.c << endl; // Hier Ton einfügen ! ExitThread( p.ThreadID ); } Sleep( 1000 ); // Be frendly to your CPU ! } }Ich verstehe einfach nicht, warum der Thread nicht startet. Ich rufe die Funktion SetTimer so auf:
[cpp]
SetTimer( 1, MONSTER.RED_BUFF );Ich würde mich über schnelle Hilfe sehr freuen.
MfG BlauBär
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du machst hier 2 böse Dinge im Zusammenhang mit CreateThread. Du castest einen Funktionszeiger (sehr sehr böse) und du benutzt CreateThread. Die Funktion CreateThread hinterlässt einen kleinen Memory-Leak (Dazu gabs irgendwo mal einen Artikel, wer daran interessert ist, möge googeln). Benutze dafür _beginthread(ex)
-
Und der dritte Fehler: Du übergibst dem Thread die Adresse einer Variablen, die wenige Millisekunden nach dem CreateThread-Aufruf schon nicht mehr existiert.
-
Ja den dritten Fehler kann man beheben in dem mal den Thread verspätet startet mit Resume. Aber wieso der nicht startet verstehe ich immer noch nicht so ganz.
MfG
-
Wenn du den Thread noch später startest, sind die verwendeten Daten erst recht weg - PARMS ist eine lokale Variable, die am Ende der SetTimer-Funktion pulverisiert wird.
Warum der Thread nicht startet, könnte dir sicher dein Debugger mitteilen - ich würde darauf tippen, daß es an Fehler 1 liegt (abgesehen von dem unkontrollierten Cast übergibst du der Thread-Funktion einen Zeiger, während die ein Objekt erwartet).
-
Ich habe die SetTime Funtkion jetz mal so verändert. Leider immer noch ohne Erfolg.
void SetTimer( MINUTE min, CREEP c ) { PARMS.min = min; PARMS.c = c; PARMS.ThreadHandle = CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE )Timer, ( LPVOID )&PARMS, 0, &PARMS.ThreadID ); }MfG
-
Wieso passt du nicht erst einfach mal die Signatur deiner Thread-Funktion richtig an ?!
DWORD WINAPI Timer ( LPVOID );Damit sparst du dir ein hässlich Funktionspointer cast. Wenns dann noch nicht geht kann man weiter schauen.
-
Nein kein Erfolg...Selbst die einfachsten Beispiele klappen nicht mit CreateThread...
MfG
-
Dann hilft nur noch eins: Lern mit deinem Debugger umzugehen - der wird dir schon sagen können, wo sich dein Code aufhängt.
-
Ich habe mir das in Olly angesehen und einen BP auf Timer gesetz, wird nicht ausgeführt. Die Adresse die im Stack liegt ist richtig. Aber er callt nicht CreateThread sonder Returnt.
MfG
-
Wo ist überhaupt deine main ? Wartest du überhaupt auf den Thread bzw. gibt es eine 2. Endlosschleife innerhalb von main ?
-
Ne in meiner Main wird nur _SetTimer gecallt.
MfG
-
Dann ist wohl offensichtlich, wieso das nicht hinhaut ?
-
Und wo?
MfG
-
?
Threads sind dazu da, zwei Sachen oder mehrere "gleichzeitig" laufen zu lassen. D.h Thread 1 und Thread 2 geben sich abwechselnd CPU-Zeit.
Startest du zb 2 Threads UND WARTEST auf diese, würden die c.a so laufen
ABABABABABABAB ...
In deinem Fall :
Thread kriegt Rechenzeit, main kriegt rechenzeit -> erreicht das return-statement und beendet damit das Programm.
-
Ok dank dir. Kann closed werden, jetz gehts.
MfG