功能不想采取我的论点?

时间:2010-06-27 07:16:12

标签: c++

一位朋友给我发了他的线程课。 现在我只想运行一个监听器,但线程不想接受该函数。 我想执行函数(在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 )”

2 个答案:

答案 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");
}