小弟想在类中定义线程函数(已定义为static),可是编译老是出现错误,各位大虾帮忙看看怎么回事:
在View类的h文件中定义:
public:
static DWORD WINAPI FireBurnThread(LPVOID param); 在View类的cpp文件中定义:
DWORD WINAPI CLearnOpenGL2View::FireBurnThread(LPVOID param)
{
return 0;
} 在View类的某个函数中启动线程:
HWND hWnd = GetSafeHwnd();
AfxBeginThread(FireBurnThread, hWnd); 结果编译提示错误:error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned long (void *)'
到底怎么回事啊?
在View类的h文件中定义:
public:
static DWORD WINAPI FireBurnThread(LPVOID param); 在View类的cpp文件中定义:
DWORD WINAPI CLearnOpenGL2View::FireBurnThread(LPVOID param)
{
return 0;
} 在View类的某个函数中启动线程:
HWND hWnd = GetSafeHwnd();
AfxBeginThread(FireBurnThread, hWnd); 结果编译提示错误:error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned long (void *)'
到底怎么回事啊?
声明:static UINT FireBurnThread(LPVOID param);
定义:UINT CLearnOpenGL2View::FireBurnThread(LPVOID param)
无类型
改parameter 2 有什么用?
我觉得该改成afxbeginthread(( AFX_THREADPROC)FireBurnThread,hWnd)
AfxBeginThread()要求线程函数的返回值类型为UINT(即unsigned int)
DWORD(是unsigned long)显然不同于UINT,所以提示参数1不能从unsigned long(即DWORD)转换
refer to MSDN:
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);你是想用第一个函数~~~~
但是你第2个参数是hWnd, 可转变为是int型(不是LPVOID),所以引用第2个函数定义...
问题已经解决了:
h文件中定义:
static UINT FireBurnThread(LPVOID param);
cpp文件中定义:
UINT CLearnOpenGL2View::FireBurnThread(LPVOID param)
{
........
}
启动线程:
AfxBeginThread(FireBurnThread, this);
编译运行良好!
结帖