我写了一些这样的测试代码,编译和工作正常......
void threadtest()
{
HANDLE hThrd;
DWORD threadId;
int i;
for (i = 0;i < 5;i++)
{
hThrd = CreateThread(
NULL,
0,
ThreadFunc,
(LPVOID)i,
0,
&threadId );
}
// more stuff
}
DWORD WINAPI ThreadFunc(LPVOID n)
{
// stuff
return 0;
}
然后我想修改代码以将ThreadFunc放入一个类中,然后声明这些类的数组。我认为代码应该是这样的:
class thread_type
{
public:
DWORD WINAPI ThreadFunc(LPVOID n)
{
// stuff
return 0;
}
};
void threadtest()
{
HANDLE hThrd;
DWORD threadId;
int i;
thread_type *slave;
slave = new thread_type[5];
for (i = 0;i < 5;i++)
{
hThrd = CreateThread(
NULL,
0,
slave[i].ThreadFunc,
(LPVOID)i,
0,
&threadId );
}
// more stuff
}
不幸的是编译器抱怨线路slave [i] .ThreadFunc,我想我可能需要一些特殊的转换,但我尝试涉及“::”和“&amp;”的所有排列似乎失败了(我对C ++很陌生)。真正的代码有一些额外的复杂性,我没有包括在内以保持清晰,但我认为它们是无关紧要的。
答案 0 :(得分:4)
代码的第一个问题,即测试类不是thread_type的后代。不知何故,您需要指定基类。 第二,如果你传递函数指针,那不应该是thiscall类型。解决方案通常是:
struct thread
{
virtual void
run() = 0;
static thread_func(void* param)
{
thread* pThread = (thread*)param;
thread->run();
}
}
struct worker : public thread
{
void
run()
{
(.. code for the thread...)
}
}
void threadtest()
{
HANDLE hThrd;
DWORD threadId;
int i;
thread *slave;
slave = new thread_type[5];
slave[0] = new worker;
slave[1] = new worker;
slave[2] = new worker;
slave[3] = new worker;
slave[4] = new worker;
for (i = 0;i < 5;i++)
{
hThrd = CreateThread(
NULL,
0,
&thread::thread_func,
(LPVOID)slave[i],
0,
&threadId );
}
// more stuff
}
请注意,这可能只是一个反映,我现在无法编译,因为我没有这里做任何事情,但逻辑应该是这样的。
答案 1 :(得分:1)
以下说明指向函数的指针和指向成员函数C++ FAQ Lite的指针之间的区别。请参阅第33.2节,其中解释了为什么您所做的事情是个坏主意。