不确定参数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);
}
答案 0 :(得分:3)
您正在尝试向CreateThread传递一个没有预期签名的类方法。所有方法的第一个参数都是this指针的相同类型,在Thread1的情况下,是CNumbergeneratorDlg *。
你应该:
这是一篇关于静态方法的文章,它展示了在这种情况下你应该如何使用static:
以下是使用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
。