我正在尝试使用 boost::asio 截止时间计时器来延迟函数调用,如下所示
#include <boost/asio.hpp>
#include "boost/thread.hpp"
#include <iostream>
class MyTest {
public:
MyTest()
:_invokeCount(0),
_handleCount(0)
{}
void handler(int i)
{
std::cout<<"\t\tHandled " <<i << std::endl;
++_handleCount;
}
void RunIOService()
{
std::cout<<"\tStarted :"<< _invokeCount<< std::endl;
_ios.run();
std::cout<<"\tFinished "<< _invokeCount << std::endl;
}
void invokeTimer()
{
std::cout<<"invoked " << ++_invokeCount << std::endl;
boost::asio::deadline_timer t(_ios, boost::posix_time::milliseconds(5));
t.async_wait(boost::bind(&MyTest::handler, this, _invokeCount));
boost::thread th = boost::thread(boost::bind(&MyTest::RunIOService, this));
}
void PrintCount()
{
std::cout<<"Count = "<< _invokeCount << std::endl;
}
void Wait()
{
while (_invokeCount > _handleCount) {
std::cout<<"X ";
Sleep(1000);
}
}
private:
int _invokeCount;
int _handleCount;
boost::asio::io_service _ios;
};
int main(int argc, char* argv[])
{
MyTest test;
for (int k=0; k<5; ++k) {
test.invokeTimer();
Sleep(40);
}
test.Wait();
test.PrintCount();
return EXIT_SUCCESS;
}
此应用程序的输出与我预期的不同:-
invoked 1
Started :1
Handled 1
Finished 1
invoked 2
Started :2
Finished 2
invoked 3
Started :3
Handled 2
Finished 3
invoked 4
Started :4
Handled 3
Finished 4
invoked 5
Started :5
Handled 4
Finished 5
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
我希望在 ios_service::run 返回之前调用每个处理程序,但从输出来看似乎并非如此(Started:2 和 Finished:2 之间缺少输出)。此外,应用程序永远不会退出。即永远不会调用第 5 个处理程序。
我错过了什么?
谢谢!
最佳答案
一些事情:
- 您可能不需要 5 个线程。为什么不创建一个线程并将事件触发到线程中运行的单个 ioservice 实例
- 尝试在线程运行函数中使用
io_service::work
,以便在处理所有请求时将io_service
保持在范围内。 - 当你等待完成时,停止你的
io_service
,加入你的线程并让你的程序退出 - 在这里阅读关于
io_service::work
的信息:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/io_service.html
关于c++ - boost asio 行为 - 从多个线程调用 ios_service::run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24846117/