不知道参数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;
}我就是这么对你们的人说的.谢谢
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);
}发布于 2012-01-04 06:31:45
您是否在Thread1中将函数static声明为static成员函数?如果没有,请这样做。
非静态类函数对于this有一个隐式附加参数。因此,类型铸造将无法工作。另一方面,静态方法不带有this参数。
然后,您可能会想知道如何在Thread1中访问类成员。一种典型的技术是通过this通过iValue。
发布于 2012-01-04 06:44:14
您正试图传递给CreateThread一个类方法,它没有它所期望的签名。所有方法的第一个参数都是相同类型的此指针,对于Thread1,CNumbergeneratorDlg*。
您应该:
这里有一篇关于静态方法的文章,它展示了在这种情况下应该如何使用静态方法:
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
发布于 2012-01-04 06:34:34
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.
}
};https://stackoverflow.com/questions/8722913
复制相似问题