2014-05-19 28 views
0

我想讓一個線程回調一個創建線程的對象的函數。但它似乎不可能通過「this」作爲參數。有沒有辦法來實現這個?提前致謝。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(但要使用升壓: :無論如何),你可以使用lambda代替綁定:

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