一位朋友给我发了他的线程课。
现在我只想运行一个监听器,但线程不想接受该函数。
我想执行函数(在static class Networks
中定义)THREAD listen(void* args)
。 THREAD
是#define THREAD unsigned __stdcall
Networks::init() {
listenerth = thread();
listenerth.run(listen, NULL, "listener");
}
在class thread
中,他将run
定义为void run( THREAD func(void*), void* args, const char* pname);
我怎样才能在另一个线程中运行listen?
[编辑] 错误信息: main.cpp(19):错误C3867:'Networks :: listen':函数调用缺少参数列表;使用'& Networks :: listen'创建指向成员的指针
但是当我将鼠标移动到错误位置(符号监听)时,它会在工具提示中显示这一点(是的,MS VC ++):
unsigned int __stdcall Networks :: listen(void * data)
错误:类型为“unsigned int”的参数 (__stdcall Networks :: *)(void * data)“ 与类型参数不兼容 “unsigned int(__stdcall )(void )”
答案 0 :(得分:2)
listenerth
是会员功能吗?如果是,那么它将不适用于run(..)
。
成员函数与类外部声明的函数不同。它们不能与普通函数指针一起使用。
答案 1 :(得分:2)
正如其他人所说,你不能在这里使用非静态成员函数,因为它需要一个普通的函数指针。如果你需要调用非静态成员(因为它需要访问类中的状态),那么你可以使用args
参数通过静态“trampoline”函数调用它,如下所示:
unsigned listen() {/* do the interesting stuff */}
static THREAD call_listen(void* me)
{
return static_cast<Networks*>(me)->listen();
}
void init()
{
listener = thread();
listener.run(call_listen, this, "listener");
}