2010-05-17 78 views
4

我有以下:奇怪C++线程功能调用

class DThread 
    { 
     virtual void run()=0; 

    _beginthreadex(NULL,0,tfunc,this,0,&m_UIThreadID); // class itself being passed as param to thread function... 

    static unsigned int __stdcall tfunc(void* thisptr) 
     { 
      static_cast<DThread*>(thisptr)->run(); 
      return 0; 
     } 

//other stuff 

} 

的运行功能由派生类中实现。

为什么在线程中被调用的函数被通过铸造this指针调用?这是好的做法吗?

不能直接调用吗?

需要运行的实际功能在派生类中。

我的问题是

+2

你的问题是...? – Anthony 2010-05-17 12:22:45

+0

为什么在线程中调用的函数是通过强制转换这个指针来调用的?这是好的做法吗? 不能直接调用吗? – 2010-05-17 12:23:26

+1

静态成员函数中没有“this”。 – eemz 2010-05-17 12:38:23

回答

2

大多数平台级别的线程API都是简单的C语言,并且需要一个普通的指针才能在新线程中运行。这意味着在C++中,函数必须是自由函数或静态成员。这些都不能访问任何类实例。构建有状态线程类的解决方法是利用线程创建调用的附加“传递”参数(这通常是稍后传递给在新线程中执行的函数的指针),并为其指向类本身,即this。然后静态函数可以调用[虚拟]成员,比如run()或类似的东西。

3

线程函数不是'class-aware'。您的实现使它们具有类的意识,以便派生的“运行”功能可以访问类成员。

1

_beginthreadex函数是一个C函数。它对C++一无所知。要从线程函数内部访问C++成员,您需要对其进行强制转换。

4

_beginthreadex需要一个(stdcall)C风格函数,它不能使用C++成员函数,因为它不知道C++。获取成员函数的方法是将一个指针传递给一个对象,并调用该函数内的成员函数。这样的功能通常被称为蹦床。