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 Funktionsformat

    AfxBeginThread(...)

    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 Bezeichner

    Mein 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 ueberein

    fixen 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


Anmelden zum Antworten