2010-06-02 25 views
0

基本上我有一个类,它是instincable(不是静态的)。基本上我希望班级能够生成自己的线程并管理自己的东西。我不想为每个我创建的实例进行全局回调,这对我来说似乎并不干净。做我想做的事的正确方法是什么?如果我尝试将threadproc传递给CreateThread,并且它是来自类实例的proc,编译器会说我不能这样做。什么是实现我想要的最好方式?谢谢线程处理一个instancable类?

+2

不要重新发明轮子,查看现有库的来源,如boost :: thread,Qt,ACE等。这已经完成了很多次。 – 2010-06-02 02:23:11

回答

0
class Obj 
{ 
    static ULONG WINAPI ThreadProc(void* p) 
    { 
     Obj* pThis = (Obj*)p; 
     ... do stuff ... 
     return 0; 
    } 

    void StartMemberThread() 
    { 
     CreateThread(... ThreadProc, this, ...); 
    } 
}; 

最棘手的部分是确保线程不使用pThis后对象消失。

+0

我见过do-while循环,但从来没有做过什么。 – 2015-11-12 13:06:30

0

你想要做的是创建一个静态成员方法,反过来调用threadproc成员。它需要一个指向类实例的指针来进行该调用,因此您需要将(this)作为(void *)参数传递给CreateThread。

0

为什么在使用简单的跨平台解决方案(如boost::thread库)时使用WIN32线程?这完全消除了你的问题。但是,如果您使用WIN32(或pthreads),则可以指定一个应该传递给线程例程的void *参数。所以,void *对象可以是一个指向类的指针;只需将其重新转换为线程例程中的正确类型即可。一旦将void *转换回类型化指针,就可以调用该对象的成员函数。

P.S.这个词是“可实例化”的。