我不知道这是否可能,但我想创建一个抽象类来使用WinAPI创建线程。该类将由类继承,该类将定义要在线程中执行的函数。
我有两个班级:
class XYZ{
//...
class ABC: public XYZ{
//...
我有一个构造
ABC::ABC()
{
addThread(this,1);
}
addThread在XYZ类中定义:
void addThread(void* self, int a)
{
DWORD ThreadID;
THREAD_DATA *threadData;
threadData->self = self;
threadData->thread_id = a;
CreateThread(NULL, 0, createThread, threadData, 0, &ThreadID);
}
正如您所看到的,我正在创建一个包含两个字段的结构:超类的对象和线程的数量(因此该方法可以知道使用哪些数据)。
这就是结构的样子:
typedef struct _THREAD_DATA {
void* self;
int thread_id;
} THREAD_DATA;
XYZ类的静态方法中的createThread:
static DWORD WINAPI createThread(void* _threadData)
{
THREAD_DATA* threadData = (THREAD_DATA*) _threadData;
return threadData->self->execute(threadData->thread_id);
}
这里是一切都出错的地方。 我的VSC ++ 2010在静态方法体的第二行中强调了第一个单词“threadDataself”。 编译后我收到错误:
左边的' - > execute'必须指向class / struct / union / generic type
我不知道如何修复它。我使用这些链接编写了这段代码: http://goo.gl/7VYC3& http://goo.gl/ETfe7
执行方法在XYZ类中声明为:
virtual DWORD execute(int i);
然后在ABC类中定义为
DWORD ABC::execute(int i){
//...
任何人都可以帮助我吗?我将不胜感激如何使其成功。
答案 0 :(得分:2)
“self”被定义为void指针,并且您试图在其上调用“execute”方法,该方法不存在。您需要将self的类型更改为包含方法“execute”的基类。
像这样:
typedef struct _THREAD_DATA {
XYZ* self;
int thread_id;
} THREAD_DATA;
当您尝试以多态方式调用重写方法时,必须确保调用方法的对象类型是基类类型。你不能使用void指针。
答案 1 :(得分:1)
您需要解决的一个明显错误:
THREAD_DATA *threadData;
threadData->self = self;
threadData->thread_id = a;
这里threadData是一个没有赋值的指针,然后你使用is作为有效指针。您需要将其更改为
THREAD_DATA *threadData = new THREAD_DATA();
并以某种方式管理其生命时间,即。在其末端的thred函数中删除它。