2013-11-15 3 views
0

Я нашел класс пула потоков, и я попытался использовать множество комбинаций для вызова метода с функцией внутри.Положите функцию в шаблон

Вот пример моей попытки:

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

Здесь являются функциями WorkerPool в:

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_; 
    } 

Что я делаю неправильно в вызове функции для этого ThreadPool? Спасибо.

+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 для вызова функции, и вам нужно отправить объект функции, который делает это. Это можно решить, используя лямбда или std::bind.

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