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::MyThreadProcstatic 成员函数(它必须具有 __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++ 多线程的主要内容,如果未能解决你的问题,请参考以下文章

怎么在基于对话框的MFC程序中实现多线程?

怎么在基于对话框的MFC程序中实现多线程?

使用MFC中的AfxBeginThread创建多线程

关闭 MFC 对话框时的多线程对象破坏

如何在多线程函数MFC中获取对话框类的指针

MFC多线程各种线程用法 .