[MSVS C++6] Thread "nicht deklarierter Bezeichner"

Bigbutcher

Erfahrenes Mitglied
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
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;

	DWORD WINAPI my_Thread ();
};

#endif

Thread.cpp
Code:
#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

BB
 
moin


Ich gehe jetzt mal davon aus das du das Visual Studio benutzt.
Dann musst du in den Projekteinstellungen einstellen das du ein Multithreading Programm erstellen willst.


mfg
umbrasaxum
 
Die Funktion, die du an eine der drei Thread-Starter übergeben kannst, darf keine Member-Funktion eines Objektes sein, es sei denn, sie ist statisch.

Du kannst aber den Startparameter dazu verwenden, der Thread-Funktion einen Pointer auf die Instanz der Klasse zu übergeben.

Also, eine statische Funktion machen, diese an die Thread-Starter übergeben. Als den LPVOID-Parameter "this" einsetzen (auf LPVOID casten). In der statischen Funktion castest du den Parameter auf einen Pointer deiner Klasse (Thread*) und rufst dort eine Memberfunktion der Klasse auf.

Durch das Gehacke hast du dann doch eine Thread-Funktion als Member.

Zusätzlich:

CreateThread ist die Win32-API-Funktion, unter Windows immer verfügbar.

_beginthread ist die C-Runtime-Funktion, benötigt als zusätzliches #include <process.h>

AfxBeginThread ist nur unter MFC verfügbar, kapselt intern _beginthread.

Du musst nicht auf multithreaded umstellen, das geht genauso unter single threaded (bzw. MFC macht das automatisch).
 
Zuletzt bearbeitet:
Thx das wars

die my_Thread Methode muss static sein.

Thx 4 help

PS
@ umbrasaxum

siehe Titel ^^
MSVS == Microsoft Visual Studio
 
Zurück