我试着按照这个链接中的示例multithreading.htm实现多线程。
UINT CCheckDlg::MyThreadProc(LPVOID Param) {
while (1){
Sleep(50); // would do some work here
}
return TRUE;
}
这是通过使用
AfxBeginThread(MyThreadProc, 0);
出现下列错误
发布于 2020-02-25 09:15:07
在调用AfxBeginThread
时有两个问题。首先,正如注释中指出的,您需要确保CCheckDlg::MyThreadProc
是static
成员函数(必须具有__cdecl
属性,尽管这可能是默认的),并使用&CCheckDlg::MyThreadProc
作为第一个参数。
另一个问题是,0
(第二个参数)被解释为一个int
参数,因此编译器无法解决要选择的两个重载中的哪一个。使用nullptr
(或显式(void *)(0)
)作为第二个参数,以便选择第一个重载。
两过载 for AfxBeginThread
是:
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);
发布于 2020-02-25 09:10:49
线程proc必须是Global
函数或类的Satic
成员函数。
请检查函数CCheckDlg::MyThreadProc
是否定义为静态函数。
在您的代码中也有一个问题.
尽管TRUE被计算为UINT,但这是一个问题。当然不会发生任何错误。但是通常情况下,所有线程在成功终止时返回0值,如果没有返回-1。也许真被定义为-1。这意味着线程函数总是以失败的形式终止。
发布于 2020-02-25 09:37:01
在这里,你必须做的是:
UINT CMFCDlg::MyThreadProc(LPVOID Param) {
return 1;
}
UINT MyThreadProc(LPVOID pParam)
{
return 0;
}
BOOL CMFCDlg::CallingFunction()
{
// First version
CWinThread * pThread = AfxBeginThread(MyThreadProc, 0);
// Second version
pThread = AfxBeginThread(&CMFCDlg::MyThreadProc, 0);
// third version
pThread = AfxBeginThread(MyThreadProc, this, THREAD_PRIORITY_IDLE, 0, CREATE_SUSPENDED);
//fourth version
pThread = AfxBeginThread(&CMFCDlg::MyThreadProc, this, THREAD_PRIORITY_IDLE, 0, CREATE_SUSPENDED);
return TRUE;
}
知道函数已被声明为类中的一个延续:
UINT static MyThreadProc(LPVOID Param);
所以你有两个选择:要么是全局函数,要么是静态函数。
https://stackoverflow.com/questions/60390205
复制相似问题