MFC 对话框错误中的 C++ 多线程
Posted
技术标签:
【中文标题】MFC 对话框错误中的 C++ 多线程【英文标题】:C++ Multithreading in MFC Dialog Errors 【发布时间】:2020-02-25 08:19:15 【问题描述】:我尝试按照此链接中的示例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':非标准语法;使用 '&' 创建指向成员的指针
【问题讨论】:
我尝试使用这两个更改,现在出现“错误 C2665 'AfxBeginThread':2 个重载都不能转换所有参数类型”的新错误。我在 Windows 中使用 VS2019。 尝试将您的线程进程声明为__cdecl
,如下所述:AfxBeginThread 和此处:The __cdecl function specifier (C++ only)。
【参考方案1】:
您致电AfxBeginThread
时遇到两个问题。首先,正如 cmets 中所指出的,您需要确保您的 CCheckDlg::MyThreadProc
是 static
成员函数(它必须具有 __cdecl
属性,尽管这可能 em> 是默认值),并使用&CCheckDlg::MyThreadProc
作为第一个参数。
另一个问题是0
(第二个参数)被解释为int
参数,因此编译器无法解析要选择的两个重载中的哪一个。使用nullptr
- 或显式(void *)(0)
- 作为第二个参数,以便选择第一个重载。
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);
【讨论】:
【参考方案2】:Thread proc 必须是 Global
函数或 Class 的 Satic
成员函数。
请检查函数 CCheckDlg::MyThreadProc
是否定义为静态的。
你的代码也有问题。
即使 TRUE 被评估为 UINT,这也是一个问题。 当然不能出现任何错误。但总的来说,所有线程在成功终止时返回 0 值,否则返回 -1。 也许 TRUE 被定义为 -1。这意味着您的线程函数总是会因失败而终止。
【讨论】:
线程可以返回 any 值来表示成功或失败。没有规定任何给定的值都具有分配给它的任何语义。甚至没有约定。目前还不清楚“将因失败而终止” 应该是什么意思。【参考方案3】:这里你必须做的:
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);
所以你有两种选择:要么是全局函数,要么是静态函数
【讨论】:
以上是关于MFC 对话框错误中的 C++ 多线程的主要内容,如果未能解决你的问题,请参考以下文章