2014-05-19 3 views
0

Я пытаюсь создать поток для обратного вызова функции объекта, создавшего поток. Но, похоже, не представляется возможным передать «это» в качестве параметра. Есть ли способ реализовать это? Заранее спасибо.C++ Boost: функция вызова из родительского потока

Helper.cpp

void Helper::ProcessSomething(void (*callback)(void)) 
{ 
    boost::this_thread::sleep(boost::posix_time::seconds(1)); 
    callback(); 
} 

SomeClass.cpp

void SomeClass::Start(void) 
{ 
    Helper *helper = Helper(); 
    boost::thread t(&Helper::ProcessSomething, helper, &this->SomeCallback); 
    t.join(); 
} 

void SomeClass::SomeCallback(void) 
{ 
    std::cout << "Callback called" << std::endl; 
} 

ответ

2

Проблема заключается в том, что SomeCallback не является статичным (по крайней мере, не то, что я могу видеть), так что есть еще один this неучтенных в thread. Кроме того, поскольку он не является статическим, вы не можете преобразовать SomeCallback в void(*)(void), который требуется ProcessSomething.

Простейшим решением было бы сделать SomeCallback статическим (и сменить &this->SomeCallback на &SomeClass::SomeCallback). Но если вы не можете, это можно обойти (я предполагаю, что у вас нет C++ 11):

void Helper::ProcessSomething(boost::function<void()> callback) 
{ 
    boost::this_thread::sleep(boost::posix_time::seconds(1)); 
    callback(); 
} 

// ... 

void SomeClass::Start(void) 
{ 
    Helper *helper = Helper(); 
    boost::function<void()> callback = boost::bind(&SomeClass::SomeCallback, this); 
    boost::thread t(&Helper::ProcessSomething, helper, callback); 
    t.join(); 
} 

Если у вас есть C++ 11 (но хотите использовать импульс: : нить в любом случае), вы можете использовать лямбда вместо привязки:

void SomeClass::Start(void) 
{ 
    Helper *helper = Helper(); 
    boost::thread t(&Helper::ProcessSomething, helper, [this]() { SomeCallback(); }); 
    t.join(); 
} 
Смежные вопросы