2010-06-27 69 views
0

一位朋友给我发了他的线程课。 现在我只想运行一个侦听器,但线程不希望接受该函数。 我想执行该功能(在static class Networks中定义)THREAD listen(void* args)THREAD#define THREAD unsigned __stdcall函数不想接受我的观点?

Networks::init() { 
    listenerth = thread(); 
    listenerth.run(listen, NULL, "listener"); 
} 

class thread他定义为runvoid run(THREAD func(void*), void* args, const char* pname);

我怎样才能像跑听在另一个线程要么?

错误消息: main.cpp(19):error C3867:'Networks :: listen':函数调用缺少参数列表;使用“&网络::听”创建一个指向成员

但是当我将鼠标移动到错误的地方(符号听),它让我这个在工具提示(当然,MS VC++):

unsigned int __stdcall Networks::listen(void* data)

Error: argument of type "unsigned int (__stdcall Networks::*)(void *data)" is incompatible with parameter of type "unsigned int (__stdcall )(void)"

+5

你也应该发布编译器给你的确切的错误信息。 – Axarydax 2010-06-27 07:30:05

+0

[这个答案]的第一个代码示例(http://stackoverflow.com/questions/3108631/how-to-pass-a-pointer-to-a-member-function-to-ac-function/3108745# 3108745)的帮助? – sbi 2010-06-27 08:04:31

+1

[使用C++类成员函数作为C回调函数]可能的重复(http://stackoverflow.com/questions/1000663/using-ac-class-member-function-as-ac-callback-function) – 2010-06-27 08:41:14

回答

2

正如别人所说,你不能在这里使用非静态成员函数,因为它期望一个正常的函数指针。如果您需要调用一个非静态成员(因为它需要在类访问状态),那么你可以使用args参数通过一个静态的“蹦床”来称呼它的功能,这样的事情:

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

listenerth的成员功能?如果是,那么它不适用于run(..)

成员函数与在类之外声明的函数不同。它们不能用于普通的函数指针。

+1

Member函数可以被使用,但是它们应该被声明为静态的。 – Patrick 2010-06-27 09:13:05

+0

Aww,我只是忘了静态... 感谢:D – aPoC 2010-06-27 10:01:41