When a class has Thread entry functions, it is usually declared as static member functions of the class as in the example below:
Class A
{
private:
int i,j,k;
public:
//Thread Entry function
static DWORD WINAPI ThreadFunc(PVOID p);
//other functions
void SomeFunc();
}
The implementation of the function does not allow access to the class members since this is a static function. One solution is to pass the class object itself as a parameter of the thread function and access the class members through the pointer passed.
The thread may be created from SomeFunc()
void SomeFunc()
{
...
...
CreateThread (NULL, 1024, A::ThreadFunc, this, CREATE_SUSPENDED, &_tid);
...
...
}
DWORD A::ThreadFunc(VOID * p)
{
A * pA = (A *)p;
//access members thru pA
pA->i = pA->j + pA->k;
return 0;
}
This approach is difficult since the object has to be de-referenced every time especially if the object is being used heavily inside the function. An easier way is to add a member function DWORD DoThreadFunc() to the class. From the original ThreadFunc, make a call to DoThreadFunc and do all the processing in DoThreadFunc as shown below.
DWORD A::ThreadFunc(VOID * p)
{
return pA->DoThreadFunc();
}
DWORD A::DoThreadFunc()
{
i = j+k;
return 0;
}
From DoThreadFunc(), we can access the class members directly. This will make the code look more readable without unwanted ->s