2013-11-15 34 views
0

我找到了一個線程池類,我嘗試了很多組合來調用裏面的函數。把功能放到模板中

這裏是比如我試試:

WorkerPool wp(4); 
wp.run_task<Connection::On_NET1_LOGIN>(&On_NET1_LOGIN()); 

這裏是工作者池的功能:

template < typename Task > 
    void run_task(Task task) 
    { 
    boost::unique_lock<boost::mutex> lock(mutex_); 

    // If no threads are available, then return. 
    if (0 == available_) return; 

    // Decrement count, indicating thread is no longer available. 
    --available_; 

    // Post a wrapped task into the queue. 
    io_service_.post(boost::bind(&WorkerPool::wrap_task, this, 
            boost::function< void() >(task))); 
    } 

private: 
    /// @brief Wrap a task so that the available count can be increased once 
    ///  the user provided task has completed. 
    void wrap_task(boost::function< void() > task) 
    { 
    // Run the user supplied task. 
    try 
    { 
     task(); 
    } 
    // Suppress all exceptions. 
    catch (...) {} 

    // Task has finished, so increment count of available threads. 
    boost::unique_lock<boost::mutex> lock(mutex_); 
    ++available_; 
    } 

我做錯了什麼在調用函數到線程池? 謝謝。

+0

什麼是錯誤信息? – MSalters

回答

1

您嘗試添加該任務是這樣的:

wp.run_task<Connection::On_NET1_LOGIN>(&On_NET1_LOGIN()); 

似乎有與此兩個問題。

  1. 您不需要指定模板參數,因爲它們可以被推斷出來。另外,如果你這樣做了,你應該指定函數的類型 - 而不是名稱。
  2. 您想要傳遞要調用的函數的地址,但您試圖調用該函數並獲取結果的地址。

爲了解決這兩方面的問題,請嘗試以下操作:

wp.run_task(&Connection::On_NET1_LOGIN); 

注意:由於On_NET1_LOGIN似乎是Connection一個成員函數,這是不行的,除非功能是static。如果不是這種情況,您需要一個Connection實例來調用該函數,並且您需要發送一個執行此操作的函數對象。這可以使用lambda或std::bind來解決。