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

出现以下错误

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

线程 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.

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

这是你必须做的:

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

所以你有两个选择:全局函数或静态函数