Code Bye

静态线程函数调用其他类的非静态函数的问题

部分代码如下:
interface AFX_EXT_CLASS IDriver
{
virtual BOOL SendCommand(CString sInput, CString& sOutput, CString& sError,DWORD TimeOut=5000)=0;
virtual BOOL SendCommand(CString sInput, CString& sOutput,DWORD TimeOut=5000)=0;
……….
}//在Driver.h中的定义IDriver类
UINT CMultiThreadDlg::ThreadFroc(LPVOID pParam)
{
pDriver->SendCommand(“MU=5”,VEL,VELError,5000);
pDriver->SendCommand(“OM=1”,VEL,VELError,5000);
}
ThreadFroc是用AfxBeginThread函数建立的工作者线程函数,为静态的线程函数。
pDriver的定义为 IDriver    *pDriver
调试时出现两个相同错误:error C2227: left of “->SendCommand” must point to class/struct/union,这里应该是静态的线程函数不能直接调用非静态成员变量造成的,问一下各位高手们,怎么样修改才能调用。
解决方案

20

AfxBeginThread(
   AFX_THREADPROC pfnThreadProc,
   LPVOID pParam,
   int nPriority = THREAD_PRIORITY_NORMAL,
   UINT nStackSize = 0,
   DWORD dwCreateFlags = 0,
   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL 
)

调用的时候,第二个参数pParam传入IDriver对象地址
然后在

UINT CMultiThreadDlg::ThreadFroc(LPVOID pParam)
{
        IDriver* pDriver = static_cast<IDriver*>(pParam);          pDriver->SendCommand("MU=5",VEL,VELError,5000);
         pDriver->SendCommand("OM=1",VEL,VELError,5000);
}

5

把 pDriver 用参数传入线程
这样 pParam 就是 pDriver。
转换一下就可以呼叫了。

5

上面都说了,用pParam传this指针,注意的是在析构前要将线程停掉。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明静态线程函数调用其他类的非静态函数的问题