关于多线程?

hanqiang 2000-04-30 01:10:00
我想在一个类的成员函数中启动一个工作者线程,这个工作者线程所用的函数是这个类的另一个成员函数,在编译时出现以下错误提示:E:\MICROSOFT VISUAL STUDIO\MYPROJECTS\Engine\Engine.cpp(70) : error C2440: 'type cast' : cannot convert from '' to 'unsigned int (__cdecl *)(void *)'
None of the functions with this name in scope match the target type
原程序大致如下:
BOOL CEngine::StartRender()
{
CWinThread* pRenderThread=NULL;
pRenderThread=AfxBeginThread((AFX_THREADPROC)Render,NULL);

return TRUE;
}
UINT CEngine::Render(LPVOID pParam);
请问这是为什么?
...全文
141 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
江王 2000-04-30
  • 打赏
  • 举报
回复
AFX_THREADPROC函数是一种全局函数,而Render是类成员函数,两种函数的指针是不一样的。实际上后者需要两个指针才能确定,一个是对象的指针,另一个才是Render函数的指针(相对于对象的编移地址)。
你的问题可以这么解决:将Render方法改为全局方法,另外,AfxBeginThread的第二个参数为this, 这样你在Render方法中仍可以访问对象中的数据。
xubin_sh 2000-04-30
  • 打赏
  • 举报
回复
错误:参数类型不匹配。参数类型必须是UINT(*fn)( LPVOID pParam );
而你传进去的却是UINT (CEngine::*fn)(LPVOID pParam);
UINT (CEngine::*fn)(LPVOID pParam)有一个隐含的参数this,所以,UINT(CEngine::*fn)(LPVOID pParam)不能通过类型转换,变成UINT (*fn)(LPVOID pParam)
建议:将Render(LPVOID pParam)不要作为CEngine的成员函数,如果在Render函数中要调用CEngine的成员函数或成员变量,可以将this指针作为AfxBeginThread的第二个参数
例子:
UINT Render(LPVOID pParam)
{
CEngine * engine=(CEngine *)pParam;
//使用其成员函数或成员变量
}
BOOL CEngine::StartRender()
{
CWinThread* pRenderThread=NULL;
pRenderThread=AfxBeginThread((AFX_THREADPROC)Render,this);
return TRUE;
}



15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧