首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CreateThread参数失效

CreateThread参数失效
EN

Stack Overflow用户
提问于 2012-01-04 06:30:07
回答 3查看 1.8K关注 0票数 0

不知道参数3或设置有什么问题吗?

代码语言:javascript
复制
error C2440: 'type cast' : cannot convert from '' to 'unsigned long (__stdcall *)(void *)'
        None of the functions with this name in scope match the target type

--

代码语言:javascript
复制
void CNumbergeneratorDlg::OnBtn3()
{
    //CreateThread
    hThread1 = CreateThread(NULL, 0, Thread1, this, 0, NULL);//<--is "this" correct

    WaitForSingleObject(hThread1,INFINITE);
    TerminateThread(hThread1,0);
    CloseHandle(hThread1);
}

DWORD WINAPI CNumbergeneratorDlg::Thread1(LPVOID iValue)
{
    CreateNumber();
    return 0;
}

???“这个”的演员

代码语言:javascript
复制
DWORD WINAPI CNumbergeneratorDlg::Thread1(LPVOID iValue)
{
    (CDialog)iValue->CreateNumber();
    return 0;
}

我就是这么对你们的人说的.谢谢

代码语言:javascript
复制
    void CNumbergeneratorDlg::OnBtn3()
{
    //CreateThread
    CNumbergeneratorDlg *pp = this;
    hThread1 = CreateThread(NULL, 0, Thread1, pp, 0, NULL);

//  WaitForSingleObject(hThread1,INFINITE);
//  TerminateThread(hThread1,0);
//  CloseHandle(hThread1);
}

DWORD WINAPI CNumbergeneratorDlg::Thread1(LPVOID iValue)
{
    CNumbergeneratorDlg *pp = (CNumbergeneratorDlg*)iValue;

    pp->CreateNumber();
    return 0;
}

void CNumbergeneratorDlg::CreateNumber()
{
    long m;
    j = 0;
    for(long i = 0; i < 1000;i++){
        m = 0;
        for(long k = 0; k < 1000000;k++){
            m ++;
        }

        j++;
    }

    AfxMessageBox("Done count");
    TerminateThread(hThread1,0);
    CloseHandle(hThread1);
}

void CNumbergeneratorDlg::OnBtn4()
{

    TerminateThread(hThread1,0);
    CloseHandle(hThread1);

    CString c;
    c.Format("%d", j);
    MessageBox(c);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-04 06:31:45

您是否在Thread1中将函数static声明为static成员函数?如果没有,请这样做。

非静态类函数对于this有一个隐式附加参数。因此,类型铸造将无法工作。另一方面,静态方法不带有this参数。

然后,您可能会想知道如何在Thread1中访问类成员。一种典型的技术是通过this通过iValue

票数 0
EN

Stack Overflow用户

发布于 2012-01-04 06:44:14

您正试图传递给CreateThread一个类方法,它没有它所期望的签名。所有方法的第一个参数都是相同类型的此指针,对于Thread1,CNumbergeneratorDlg*。

您应该:

  • 使方法Thread1静态,或者
  • 将其移出类之外。

这里有一篇关于静态方法的文章,它展示了在这种情况下应该如何使用静态方法:

http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr039.htm

以下是使用CreateThread时可能有用的一篇文章:

http://adilevin.wordpress.com/2009/06/07/createthread-an-example/

我还建议您阅读以下内容,以了解调用约定(“__stdcall”位):

http://msdn.microsoft.com/en-us/library/zxk0tw93(v=vs.80).aspx

票数 3
EN

Stack Overflow用户

发布于 2012-01-04 06:34:34

Thread1是一个非静态的成员函数.调用它需要类的一个实例(CNumbergeneratorDlg)。所以你才会犯这个错误。

您可以使Thread1成为静态的,并在创建线程时通过参数传递this

代码语言:javascript
复制
class CNumbergeneratorDlg {
    void OnBtn3() {
        hThread1 = CreateThread(NULL, 0, Thread1, this, 0, NULL);
        // ...
    }
public:
    static DWORD Thread1(LPVOID lpdwThreadParam) {
        CNumbergeneratorDlg *instance =
            static_cast<CNumbergeneratorDlg *>(lpdwThreadParam);
        // do something with instance.
    }
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8722913

复制
相关文章

相似问题

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