创建线程时,线程函数如果要设置成类的成员函数,则必须是静态成员函数,在此函数中不能使用非静态成员变量,如果要使用非静态成员变量的话,比如在MFC中,最好不要将MFC类的指针传递给线程函数,最好是传句柄给线程,创建线程用AfxBeginThread,把this作为第二个参数传递。 线程函数是回调函数,因此它必须是静态成员函数或者是类外部声明的全局函数。
全局线程函数:
UINT Thread(pParam)
{
Your_Class *p=(Your_Class *)pParam;
//然后用p间接使用成员变量。
}
线程函数为类的成员函数:
在线程中使用变量都必须是全局变量,成员变量定义成static,才能在线程函数中访问成员变量。
这里说明一种在线程函数中访问非静态成员变量的方法:
这里定义Thread类:
class Thread
{
public:
static UINT threadMessageBoxAdapter( LPVOID lParam );
UINT threadMessageBoxProc( );
private:
CString strThreadText;
};
线程函数的实现:
UINT Thread::threadMessageBoxAdapter( LPVOID lParam )
{
CTestVectorDlg* obj = ( CTestVectorDlg* )lParam;
return obj->threadMessageBoxProc();
}
UINT Thread::threadMessageBoxProc()
{
CString strThreadText;
strThreadText.Format( _T( "%s" ), _T( "Thread adapter" ) );
AfxMessageBox( strThreadText );
return 0;
}
使用AfxBeginThread启动线程:
CWinThread* thread;
thread = AfxBeginThread( threadMessageBoxAdapter, this );
这样,当线程启动后,弹出”Thread Adapter”的信息,说明成功访问成员变量。