首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MFC对话错误中的C++多线程处理

MFC对话错误中的C++多线程处理
EN

Stack Overflow用户
提问于 2020-02-25 08:19:15
回答 3查看 442关注 0票数 2

我试着按照这个链接中的示例multithreading.htm实现多线程。

代码语言:javascript
运行
复制
UINT CCheckDlg::MyThreadProc(LPVOID Param) {
    while (1){
        Sleep(50); // would do some work here
    }
    return TRUE;
}

这是通过使用

代码语言:javascript
运行
复制
AfxBeginThread(MyThreadProc, 0);

出现下列错误

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-25 09:15:07

在调用AfxBeginThread时有两个问题。首先,正如注释中指出的,您需要确保CCheckDlg::MyThreadProcstatic成员函数(必须具有__cdecl属性,尽管这可能是默认的),并使用&CCheckDlg::MyThreadProc作为第一个参数。

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

两过载 for AfxBeginThread是:

代码语言:javascript
运行
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2020-02-25 09:10:49

线程proc必须是Global函数或类的Satic成员函数。

请检查函数CCheckDlg::MyThreadProc是否定义为静态函数。

在您的代码中也有一个问题.

尽管TRUE被计算为UINT,但这是一个问题。当然不会发生任何错误。但是通常情况下,所有线程在成功终止时返回0值,如果没有返回-1。也许真被定义为-1。这意味着线程函数总是以失败的形式终止。

票数 1
EN

Stack Overflow用户

发布于 2020-02-25 09:37:01

在这里,你必须做的是:

代码语言:javascript
运行
复制
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;
}   

知道函数已被声明为类中的一个延续:

代码语言:javascript
运行
复制
UINT static MyThreadProc(LPVOID Param);   

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60390205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档