boost协程库使用与编程示例

concreteHAM 2014-07-08 05:51:54
http://blog.csdn.net/concreteham/article/details/37564145
最近研究如何简化C++在工业自动化控制中的程序设计,刚开始使用的是多线程,然后是异步,接着就是现在的协程(coroutine),什么是协程自己去找吧,反正就是一种协作式多任务的编程方法,和多线程不同,多线程是抢占式的,由操作系统分配时间片的。协程说白了就是把以前使用异步的各种handler集成到一个协程函数内部,在需要的时候分段执行,并且保留栈的上下文,当然内部是肯定不能有阻塞性质的代码,例如系统API Sleep()。

这个示例是基于boost_1.55版本中的coroutine库实现,把一个协程封装到一个函数内,类似于线程的入口函数,然后在内部实现本来需要用一连串异步实现的逻辑。这对于简化工业自动化流程控制至关重要,极大的增强了程序的可读性和可维护性。

示例的主要逻辑就是检测键盘上的按键(上下左右四个键)状态,按下后检测弹起,如果超过1s没弹起就算超时,逻辑很简单,只使用了一个线程。

// coro_test.cpp : 定义控制台应用程序的入口点。  
//

#include "stdafx.h"
#include "ios_proxy.h"
#include "boost_coroutine.h"
#include <Windows.h>

void check_key_down(boost_coro* coro, int id)
{//检测按键按下
while (GetKeyState(id) >= 0)
{
coro->sleep(1);
}
}

void check_key_up(boost_coro* coro, int id)
{//检测按键弹起
while (GetKeyState(id) < 0)
{
coro->sleep(1);
}
}

void timeout_check(boost_coro* coro, coro_handle keyCoro)
{
coro->sleep(1000);
keyCoro->force_quit();//超时后强制结束check_key_up
}

void coro_test(boost_coro* coro, int id)
{
while (true)
{//按按键下后,检测弹起,1000ms内没有弹起就是超时错误
coro->run_another_coro_complete(coro->this_strand(), boost::BOOST_BIND(&check_key_down, _1, id));//检测按下
boost_coro::child_coro_handle checkUp = coro->create_child_coro(coro->this_strand(),
boost::BOOST_BIND(&check_key_up, _1, id));//创建一个检测弹起的子协程
boost_coro::child_coro_handle checkTm = coro->create_child_coro(coro->this_strand(),
boost::BOOST_BIND(&timeout_check, _1, (coro_handle)checkUp));//创建一个检测弹起超时的子协程
coro->child_coro_run(checkUp);//开始运行子协程
coro->child_coro_run(checkTm);
if (coro->child_coro_wait_complete(checkUp))//等待,正常退出的返回true,被强制关闭的返回false
{
printf("ok %d-%d\n", GetCurrentThreadId(), id);
}
else
{
printf("timeout %d-%d\n", GetCurrentThreadId(), id);
}
coro->child_coro_quit(checkTm);//最后关闭超时子协程
}
}

int _tmain(int argc, _TCHAR* argv[])
{
ios_proxy ios;
ios.run();//单线程运行,整个程序三个线程,主线程、隐藏的timer线程、ios运行线程
shared_strand strand = boost_strand::create(ios);
coro_handle coroLeft = boost_coro::static_create(strand, boost::BOOST_BIND(&coro_test, _1, VK_LEFT));//左方向键测试
coro_handle coroRight = boost_coro::static_create(strand, boost::BOOST_BIND(&coro_test, _1, VK_RIGHT));//右方向键测试
coro_handle coroUp = boost_coro::static_create(strand, boost::BOOST_BIND(&coro_test, _1, VK_UP));//上方向键测试
coro_handle coroDown = boost_coro::static_create(strand, boost::BOOST_BIND(&coro_test, _1, VK_DOWN));//下方向键测试
coroLeft->start_run();
coroRight->start_run();
coroUp->start_run();
coroDown->start_run();
// getchar();
// coroLeft->force_quit();
// coroRight->force_quit();
// coroUp->force_quit();
// coroDown->force_quit();
ios.waitStop();
return 0;
}


完整代码:

http://pan.baidu.com/s/1gdxLsQZ

以编译的boost库:

http://pan.baidu.com/s/1u7Hr4
...全文
1607 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
concreteHAM 2014-12-24
  • 打赏
  • 举报
回复
concreteHAM 2014-08-20
  • 打赏
  • 举报
回复
http://pan.baidu.com/s/1eQvM0AQ
concreteHAM 2014-07-09
  • 打赏
  • 举报
回复
完整代码 http://pan.baidu.com/s/1c01pmeO
ztenv 版主 2014-07-08
  • 打赏
  • 举报
回复
听起来很不错的样子

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧