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();}
size=3>
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;}
size=3>
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;}
size=3>
From DoThreadFunc(), we can access the class members directly. This will make the code look more readable without unwanted ->s