用C ++将对象传递给线程

时间:2014-08-22 00:17:34

标签: c++ multithreading object

我有一个项目,它创建一个存储在头文件中的类的对象。 我需要将这个对象传递给main函数中的一个线程。

目前我使用hChatThread = CreateThread(NULL,0,ChatFunc,"1",0,&dwChatThreadId);作为创建线程的方式,似乎我无法改变被调用函数只能将LPVOID作为一种类型的事实。如果我可以以某种方式改变这一点,那么我可以将对象作为参数传递,如:hChatThread = CreateThread(NULL,0,ChatFunc,myObject,0,&dwChatThreadId);

但似乎这几乎是不可能的。

有什么想法吗?

主题:

DWORD WINAPI ChatFunc(LPVOID randparam)
{
    ServerMain(myObject); //need to pass object again here to be used in other functions
    return 0;
}

主要:

int main(int argc, char *argv[])
{
    myObject w;
    w.exec();
    hChatThread = CreateThread(NULL,0,ChatFunc,"1",0,&dwChatThreadId);
    return 0;
}

3 个答案:

答案 0 :(得分:1)

您可以使用LPVOID lpParameter传递指向对象的指针,然后将其强制转换。像这样:

int main(int argc, char *argv[])
{
    myObject w;
    w.exec();
    hChatThread = CreateThread(NULL,0,ChatFunc,&w,0,&dwChatThreadId);

    // wait for the thread to terminate,
    // otherwise w might get destroyed while the thread
    // is still using it (see comments from @MartinJames)

    return 0;
}

DWORD WINAPI ChatFunc(LPVOID param)
{
     myObject* p = static_cast<myObject*>(param);
    ServerMain(p); //need to pass object again here to be used in other functions
    return 0;
}

答案 1 :(得分:0)

最简单的方法是将该Object作为头文件中的全局对象,并假设您包含了代码:

#include "headerFilesName.h"

在主要功能所在的文件中。然后我将使用main函数在文件中声明另一个对象,并将其值传递给它

headerFileName myNewObject;

使用头文件类的此对象,您应该能够访问最初创建的其他对象。

答案 2 :(得分:0)

只有一个灵活的解决方案 - 动态分配&#39; w&#39;使用operator new,将指针传递给CreateThread,将其强制转换回线程函数,当/如果线程函数退出/返回并且不再需要对象实例,则将其删除。

所有其他解决方案要么不能可靠地工作,要么是混乱的全球化,要么是不灵活的。