MFC 对话框错误中的 C++ 多线程
C++ Multithreading in MFC Dialog Errors
我尝试按照 link 中的示例 https://www.tutorialspoint.com/mfc/mfc_multithreading.htm 实现多线程。
UINT CCheckDlg::MyThreadProc(LPVOID Param) {
while (1){
Sleep(50); // would do some work here
}
return TRUE;
}
这是使用
调用的
AfxBeginThread(MyThreadProc, 0);
出现以下错误
- E0304 没有重载函数的实例 "AfxBeginThread" 匹配参数列表
- C3867 'CCheckDlg::MyThreadProc': 非标准语法;使用“&”创建指向成员
的指针
线程 proc 必须是 Global
函数或 Class 的 Satic
成员函数。
请检查函数 CCheckDlg::MyThreadProc
是否定义为静态。
你的代码也有问题。
即使 TRUE 被评估为 UINT,这也是一个问题。
当然不能出什么差错。但一般来说,所有线程在成功终止时 returned 值为 0,否则它们 return -1。
也许 TRUE 被定义为 -1。这意味着您的线程函数总是会因失败而终止。
您对 AfxBeginThread
的调用有两个问题。首先,正如评论中所指出的,您需要确保您的 CCheckDlg::MyThreadProc
是一个 static
成员函数( 必须 具有 __cdecl
属性, 尽管此 可能 是默认值),并使用 &CCheckDlg::MyThreadProc
作为第一个参数。
另一个问题是 0
(第二个参数)被解释为 int
参数,因此编译器无法将两个重载中的哪一个解析为 select。使用 nullptr
- 或显式 (void *)(0)
- 作为第二个参数,以便第一个重载将被 selected.
AfxBeginThread
的 two overloads 是:
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);
这是你必须做的:
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;
}
知道该函数已在 class 中声明为延续:
UINT static MyThreadProc(LPVOID Param);
所以你有两个选择:全局函数或静态函数
我尝试按照 link 中的示例 https://www.tutorialspoint.com/mfc/mfc_multithreading.htm 实现多线程。
UINT CCheckDlg::MyThreadProc(LPVOID Param) {
while (1){
Sleep(50); // would do some work here
}
return TRUE;
}
这是使用
调用的AfxBeginThread(MyThreadProc, 0);
出现以下错误
- E0304 没有重载函数的实例 "AfxBeginThread" 匹配参数列表
- C3867 'CCheckDlg::MyThreadProc': 非标准语法;使用“&”创建指向成员 的指针
线程 proc 必须是 Global
函数或 Class 的 Satic
成员函数。
请检查函数 CCheckDlg::MyThreadProc
是否定义为静态。
你的代码也有问题。
即使 TRUE 被评估为 UINT,这也是一个问题。 当然不能出什么差错。但一般来说,所有线程在成功终止时 returned 值为 0,否则它们 return -1。 也许 TRUE 被定义为 -1。这意味着您的线程函数总是会因失败而终止。
您对 AfxBeginThread
的调用有两个问题。首先,正如评论中所指出的,您需要确保您的 CCheckDlg::MyThreadProc
是一个 static
成员函数( 必须 具有 __cdecl
属性, 尽管此 可能 是默认值),并使用 &CCheckDlg::MyThreadProc
作为第一个参数。
另一个问题是 0
(第二个参数)被解释为 int
参数,因此编译器无法将两个重载中的哪一个解析为 select。使用 nullptr
- 或显式 (void *)(0)
- 作为第二个参数,以便第一个重载将被 selected.
AfxBeginThread
的 two overloads 是:
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);
这是你必须做的:
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;
}
知道该函数已在 class 中声明为延续:
UINT static MyThreadProc(LPVOID Param);
所以你有两个选择:全局函数或静态函数