MSVC++6 Thread kann nicht kompiliert werden
-
Guten Morgen, liebe Community!
Ich bin gerade dabei mir eine kleine Thread Klasse zu schreiben, jedoch stoße ich auf einen kleinen hartnäckigen Fehler, aber zuerst mein kompletter Code:
Thread.h
#ifndef __THREAD_H__ #define __THREAD_H__ #include <iostream> #include <windows.h> #include <process.h> using namespace std; class Thread { public: Thread(); ~Thread(); void start (); void suspend (); void stop (); void setParameter(LPVOID pParam); private: HANDLE hThread; DWORD dwThread; LPVOID pParam; enum Status { STOPPED, RUNNING, SUSPENDING }; int status; DWORD WINAPI my_Thread (); }; #endif
Thread.cpp
#ifndef __THREAD_CPP__ #define __THREAD_CPP__ #include "Thread.h" Thread::Thread() { this->status = STOPPED; } Thread::~Thread() { if (this->status == RUNNING || this->status == SUSPENDING) { this->stop(); } } void Thread::start () { if (this->status == RUNNING) { // Thread läuft bereits return; } else if (this->status == SUSPENDING) { // Thread fortsetzen this->status = RUNNING; // ResumeThread(this->hThread); } else { // Thread starten this->status = RUNNING; // this->hThread = CreateThread(NULL, 0, this->my_Thread, NULL, 0, this->dwThread); // this->hThread = AfxBeginThread(this->my_Thread, NULL); // this->hThread = _beginthread(this->my_Thread, 0, NULL); } } void Thread::stop () { if (this->status == RUNNING || this->status == SUSPENDING) { this->status = STOPPED; // AfxEndThread(); // TerminateThread(this->hThread, this->dwThread); // this->hThread = _endthread(); } } void Thread::suspend () { if (this->status == RUNNING) { // SuspendThread(this->hThread); } } DWORD WINAPI Thread::my_Thread () { while (true) { cerr << "Thread" << endl; Sleep(1000); } return (0); } #endif
Wenn ich jetzt eine dieser auskommentierten Stellen einfüge bekomme ich jeweils immer diese Fehlermeldungen:
CreateThread(...)
error C2664: 'CreateThread' : Konvertierung des Parameters 3 von 'unsigned long (void)' in 'unsigned long (__stdcall *)(void *)' nicht moeglich
Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein_beginthread(...)
error C2065: '_beginthread' : nichtdeklarierter Bezeichner
error C2440: '=' : 'int' kann nicht in 'void *' konvertiert werden
Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
error C2065: '_endthread' : nichtdeklarierter Bezeichner
error C2440: '=' : 'int' kann nicht in 'void *' konvertiert werden
Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder FunktionsformatAfxBeginThread(...)
error C2065: 'AfxBeginThread' : nichtdeklarierter Bezeichner
error C2440: '=' : 'int' kann nicht in 'void *' konvertiert werden
Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
error C2065: 'AfxEndThread' : nichtdeklarierter BezeichnerMein Ziel ist es, ein Thread Objekt zu erzeugen und die Methode my_Thread als Thread zu starten.
Aber irgendwie will das ganze anscheinend noch nicht so ganz.Falls noch irgendetwas unklar ist, dann fragt bitte nach. Ich bin hier grad ein wenig am verzweifeln...
MfG
Vic
-
Vic schrieb:
CreateThread(...)
error C2664: 'CreateThread' : Konvertierung des Parameters 3 von 'unsigned long (void)' in 'unsigned long (__stdcall *)(void *)' nicht moeglich
Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp uebereinfixen wir erstmal das und schaun was sich ändert
DWORD WINAPI my_Thread ();
ändern zu
static DWORD WINAPI my_Thread ( void* );
-
Thx das wars.
Hier nochmal der komplette modifizierte Code:
#ifndef __THREAD_H__ #define __THREAD_H__ #include <iostream> #include <windows.h> #include <process.h> using namespace std; class Thread { public: Thread(); ~Thread(); void start (); void suspend (); void stop (); void setParameter(LPVOID pParam); private: HANDLE hThread; DWORD dwThread; LPVOID pParam; enum Status { STOPPED, RUNNING, SUSPENDING }; int status; static DWORD WINAPI my_Thread (void*); }; #endif
Thread.cpp
#ifndef __THREAD_CPP__ #define __THREAD_CPP__ #include "Thread.h" Thread::Thread() { this->status = STOPPED; } Thread::~Thread() { if (this->status == RUNNING || this->status == SUSPENDING) { this->stop(); } } void Thread::start () { if (this->status == RUNNING) { // Thread läuft bereits return; } else if (this->status == SUSPENDING) { // Thread fortsetzen this->status = RUNNING; ResumeThread(this->hThread); } else { // Thread starten this->status = RUNNING; this->hThread = CreateThread(NULL, 0, this->my_Thread, NULL, 0, &dwThread); // this->hThread = AfxBeginThread(this->my_Thread, NULL); // this->hThread = _beginthread(this->my_Thread, 0, NULL); } } void Thread::stop () { if (this->status == RUNNING || this->status == SUSPENDING) { this->status = STOPPED; // AfxEndThread(); TerminateThread(this->hThread, this->dwThread); // this->hThread = _endthread(); } } void Thread::suspend () { if (this->status == RUNNING) { SuspendThread(this->hThread); } } DWORD WINAPI Thread::my_Thread (void* ) { while (true) { cerr << "Thread" << endl; Sleep(1000); } return (0); } #endif
Edit:
Nur zum Verständnis, warum muss die Methode static sein?
-
Weil du sonst nicht ohne ein Objekt aufrufen kannst.
-
Klingt logisch
Ich dachte nur, dass das auch so gehen müsste, da ja bereits ein Objekt existiert, und sich quasi ja selbst in den Threadzustand versetzt.
Naja hab mich wohl geirrt,
thx für die schnelle Hilfe!
MfG
Vic
-
es existiert zwar ein objekt, das is aber innerhalb der createfunktion nicht bekannt