Windows SDK Thread: How to use member functions as thread functions?
Q: How to use member functions as thread functions?
A: While trying to use member functions of a class as thread functions the compiler might complain with some kind of error like
Code:
error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to
'unsigned long (__stdcall *)(void *)'
None of the functions with this name in scope match the target type
or
error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from
type 'unsigned int (void *)'
The problem is that every thread function has its own prototype, which determines the parameters that gets passed from the operating system to it.
In C++ every member function has a hidden parameter - the so-called '<b>this</b>' pointer which will be automatically passed to the function. C++ is able to associate a function with a particular instance of an object by means of the '<b>this</b>' pointer. Member functions access member variables through the '<b>this</b>' pointer...
Code:
class foo
{
public:
void func() { integer_ = 0; }
private:
int integer_;
};
This code will be compiled as
Code:
class foo
{
public:
void func(foo* this) { this->integer_ = 0; }
private:
int integer_;
};
The operating system does not call thread functions through objects therefore it cannot handle the automatically added '<b>this</b>' pointer... To get member functions working as thread routines you need to tell the compiler explicitly not to expect a 'this' pointer. To avoid the automatic 'this' pointer you have two possibilities:
- Non-member functions
- Static member functions
Non-member functions are not part of a class and therefore do not have a 'this' pointer. Static member functions do not receive a this' pointer either...thus, if you want to use a member function as a thread routine you need to declare it as 'static'...
More information can be found here and here.
<br><br>