我有以下内容:
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
}
run函数在派生类中实现。
为什么在线程中调用的函数是通过强制转换this
指针调用的?这是好习惯吗?
不能直接调用吗?
需要运行的实际函数在派生类中。
我的问题是
答案 0 :(得分:4)
_beginthreadex
需要一个(stdcall)C样式函数,它不能使用C ++成员函数,因为它不了解C ++。获取成员函数的方法是将指针传递给对象并调用该函数内的成员函数。这种功能通常被称为蹦床。
答案 1 :(得分:3)
线程函数不是“类感知”。您的实现使它们可以识别类,以便派生的'run'函数可以访问类成员。
答案 2 :(得分:2)
大多数平台级线程API都是简单的C并且使用一个普通的指针来指向在新线程中运行的函数。这意味着在C ++中,函数必须是自由函数或静态成员。这些都不能访问任何类实例。构建有状态线程类的解决方法是利用线程创建调用的附加“传递”参数(通常是稍后传递给新线程中执行的函数的指针),并为其指定类本身,即this
。然后静态函数可以调用[虚拟]成员,比如run()
或类似的东西。
答案 3 :(得分:1)
_beginthreadex函数是一个C函数。它对C ++一无所知。要从线程函数中访问C ++成员,您需要将其强制转换。