2010-06-27 2 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 он определил run в void run(THREAD func(void*), void* args, const char* pname);

Как я могу получить, чтобы работать слушать в другом потоке либо?

Сообщение об ошибке: main.cpp (19): ошибка C3867: «Сети :: прослушивание»: вызов функции отсутствует список аргументов; использовать «& сети :: слушать», чтобы создать указатель на член

Но когда я двигаю мышь к месту ошибки (символ слушать), он показывает мне это в подсказке (да, 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

+0

Имеет ли первый пример кода [этот ответ] (http://stackoverflow.com/questions/3108631/how-to-pass-a-pointer-to-a-member-function-to-ac-function/3108745# 3108745) помощь? – sbi

+1

Возможный дубликат [Использование функции члена класса C++ как функции обратного вызова C] (http://stackoverflow.com/questions/1000663/using-ac-class-member-function-as-ac-callback-function) –

ответ

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 a функция-член? Если это так, то это не будет работать для run(..).

Функции-члены не такие, как функции, объявленные вне классов. Они не могут использоваться с обычными указателями функций.

+1

Участник функции могут использоваться, но они должны быть объявлены статическими. – Patrick

+0

Все, я просто забыл статические ... Спасибо: D – aPoC

Смежные вопросы