CreateThread参数失败

时间:2012-01-04 06:30:08

标签: c++ visual-c++

不确定参数3或设置有什么问题?

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

-

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

???铸造“这个”

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

XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX

这就是我对你们这些人做的事情......谢谢

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

3 个答案:

答案 0 :(得分:3)

您正在尝试向CreateThread传递一个没有预期签名的类方法。所有方法的第一个参数都是this指针的相同类型,在Thread1的情况下,是CNumbergeneratorDlg *。

你应该:

  • 使方法Thread1成为静态或
  • 将它移到课堂外。

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

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

答案 1 :(得分:2)

Thread1是一个非静态成员函数。调用它需要您的类的实例(CNumbergeneratorDlg)。这就是你得到这个错误的原因。

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

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 :(得分:0)

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

非静态类函数具有this的隐式附加参数。因此,类型转换将不起作用。另一方面,静态方法不携带this参数。

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