在基类中创建从子类运行方法的线程

时间:2012-10-23 21:28:27

标签: c++ multithreading winapi object inheritance

我不知道这是否可能,但我想创建一个抽象类来使用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){
//...

任何人都可以帮助我吗?我将不胜感激如何使其成功。

2 个答案:

答案 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函数中删除它。