我找到了一个线程池类,我尝试了很多组合来调用带有函数的方法。
以下是我尝试的示例:
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_;
}
在调用该线程池的函数时我做错了什么? 感谢。
答案 0 :(得分:1)
您正尝试添加如下任务:
wp.run_task<Connection::On_NET1_LOGIN>(&On_NET1_LOGIN());
这似乎有两个问题。
要解决这两个问题,请尝试以下操作:
wp.run_task(&Connection::On_NET1_LOGIN);
注意:由于On_NET1_LOGIN
似乎是Connection
的成员函数,因此除非函数为static
,否则无效。如果不是这种情况,则需要Connection
实例来调用该函数,并且需要发送一个执行此操作的函数对象。这可以使用lambda或std::bind
来解决。