【发布时间】:2011-10-14 00:55:32
【问题描述】:
我有一门课,例如:
class MyStreamReader
{
public:
MyStreamReader(MyPramameter myPram) {.....}
~MyStreamReader() {}
DWORD WINAPI ReaderThread(LPVOID *lpdwThreadParam )
{
//....
}
};
我想用 WinAPI CreateThread 调用 ReaderThread。 但是 CreateThread 想要 ReaderThread 函数想要一个静态函数。
在某些形式中,据说这可以通过 boost 库实现,例如:
CreateThread(NULL, 0, boost::bind(&MyStreamReader::ReaderThread,this),
(void*)&myParameterObject), 0, NULL);
但是我得到了编译错误:
'CreateThread' : cannot convert parameter x from 'boost::_bi::bind_t<R,F,L>'
to 'LPTHREAD_START_ROUTINE'
因此我的问题是:
- 是否可以调用类的非静态函数 使用 boost lib(或任何其他方法)创建线程
- 如果没有任何 C++ THREADing 库,您可以推荐(对于 Visual C++)我可以调用运行类的非静态成员函数作为线程吗?
最好的祝福
更新:
所以第一个问题:似乎无法从 CreateThread win API 调用非静态 c++ 成员函数...
因此,对 C++ 多线程库的任何建议都可以将非静态函数作为线程调用...
更新 2: 好吧,我尝试提升线程库...似乎它有效...
MyStreamReader* streamReader = new MyStreamReader(myParameters);
boost::thread GetStreamsThread
( boost::bind( &MyStreamReader::ReaderThread, streamReader ) );
或者(不需要绑定)
boost::thread GetStreamsThread(&MyStreamReader::ReaderThread, streamReader);
并且为了使用 boost::thread 我将我的类定义更新为:
class MyStreamReader
{
public:
MyStreamReader(MyPramameter myPram) {.....}
~MyStreamReader() {}
void ReaderThread()
{
//....
}
};
【问题讨论】:
-
远离
CreateThread,如果你真的必须使用_beginthread或_beginthreadex。这些功能太低级,无法处理线程。听听@Kaz Dragon。 -
@sad_man 为什么
_beginthread比CreateThread好? -
@David: This 对我来说已经足够了,除非你有话要说。
-
@sad_man _beginthread 是非静态 c 函数的一个很好的替代方案,但在 C++ 成员函数方面很糟糕......
-
@sad_man 从
CreateThread创建的线程中使用 C 运行时的问题已在运行时的最新版本中得到修复。无论如何,这是一个可笑的限制。如果您想在由其他模块创建的线程中运行代码怎么办?
标签: multithreading winapi boost boost-thread createthread