2013-01-31 24 views
-1

我想封裝一個線程,因爲它是如下所示: http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html多線程使用boost:編譯器錯誤

但不知何故,我甚至無法編譯我的程序。這:

/** 
* 
*/ 
void AcceptConnectionThread::start(int param) 
{ 
    m_thread = boost::thread(&AcceptConnectionThread::AcceptConnectionThreadRun, this, 0); 
} 


/** 
* 
*/ 
int AcceptConnectionThread::AcceptConnectionThreadRun() 
{ 
    return 0; 
} 

剛使我這個:

Description Resource Path Location Type required from `boost::_bi::bind_t<R, F, L>::result_type boost::_bi::bind_t<R, F, L>::operator()() [with R = void; F = int (*)(); L = boost::_bi::list2<boost::_bi::value<AcceptConnectionThread*>, boost::_bi::value<int> >; boost::_bi::bind_t<R, F, L>::result_type = void]’ ServerNetwork  line 20, external location: /usr/include/boost/bind/bind_template.hpp C/C++ Problem 
Description Resource Path Location Type required from ‘void boost::detail::thread_data<F>::run() [with F = boost::_bi::bind_t<void, int (*)(), boost::_bi::list2<boost::_bi::value<AcceptConnectionThread*>, boost::_bi::value<int> > >]’ ServerNetwork  line 62, external location: /usr/include/boost/thread/detail/thread.hpp C/C++ Problem 
Description Resource Path Location Type too many arguments to function ServerNetwork  line 313, external location: /usr/include/boost/bind/bind.hpp C/C++ Problem 

這是模板的構造函數,用於:

template <class F,class A1,class A2> 
thread(F f,A1 a1,A2 a2): 
    thread_info(make_thread_info(boost::bind(boost::type<void>(),f,a1,a2))) 
{ 
    start_thread(); 
} 

我真的沒有任何想法是什麼問題..

編輯:

無論如何,它的工作原理與此..但這種方式我不能傳遞任何參數..

/** 
* 
*/ 
void AcceptConnectionThread::start(int param) 
{ 
    m_thread = boost::thread(&AcceptConnectionThread::AcceptConnectionThreadRun); 
} 
+0

,如果你改變'AcceptConnectionThreadRun'聲明,而不是採取對米? – didierc

+0

@didierc本教程提供了「Worker :: start()方法生成將運行processQueue方法的線程。請注意我們如何傳入此作爲第一個綁定參數?因爲我們使用的是實例方法(而不是類方法或者規則函數),我們必須確保第一個參數是實例指針,N參數是線程函數的第一個實際參數,可以在其簽名中看到。 我不知道如何解決此問題..但它應該無論如何工作。任何猜測什麼可能導致這個問題? – displayname

+0

疏忽。這個綁定操作符需要實例和傳遞給該方法的參數,但這裏有一個額外的參數'0',而不帶參數的方法。查看[this SO question](http://stackoverflow.com/questions/527413/how-boostfunction-and-boostbind-work)瞭解'boost :: bind'的細節。 – didierc

回答

0

使用boost::bind



    /** 
    * 
    */ 
    void AcceptConnectionThread::start(int param) 
    { 
     int para_to_pass = 0; 
     m_thread = boost::thread(boost::bind(&AcceptConnectionThread::AcceptConnectionThreadRun, this, para_to_pass)); 
    } 


    /** 
    * 
    */ 
    int AcceptConnectionThread::AcceptConnectionThreadRun(int para) 
    { 
     // use para 
     return 0; 
    }