【问题标题】:C++ Multithreading in MFC Dialog ErrorsMFC 对话框错误中的 C++ 多线程
【发布时间】: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);

出现以下错误

  1. E0304 没有与参数列表匹配的重载函数“AfxBeginThread”实例
  2. C3867 'CCheckDlg::MyThreadProc':非标准语法;使用 '&' 创建指向成员的指针

【问题讨论】:

  • 我尝试使用这两个更改,现在出现“错误 C2665 'AfxBeginThread':2 个重载都不能转换所有参数类型”的新错误。我在 Windows 中使用 VS2019。
  • 尝试将您的线程进程声明为__cdecl,如下所述:AfxBeginThread 和此处:The __cdecl function specifier (C++ only)

标签: c++ multithreading mfc


【解决方案1】:

您致电AfxBeginThread 时遇到两个问题。首先,正如 cmets 中所指出的,您需要确保您的 CCheckDlg::MyThreadProcstatic 成员函数(它必须具有 __cdecl 属性,尽管这可能 em> 是默认值),并使用&CCheckDlg::MyThreadProc 作为第一个参数。

另一个问题是0(第二个参数)被解释为int 参数,因此编译器无法解析要选择的两个重载中的哪一个。使用nullptr - 或显式(void *)(0) - 作为第二个参数,以便选择第一个重载。

AfxBeginThreadtwo 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);   
    

    所以你有两种选择:要么是全局函数,要么是静态函数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多