技术CTO-关注编程入门知识,提供编程入门教程

您的位置: 首页 > 程序开发 > c/c++ > 正文

boost协程库使用与编程示例

来源: 技术CTO 阅读:

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
听起来很不错的样子
完整代码
http://pan.baidu.com/s/1c01pmeO

^_^ 如果您热爱技术、热爱编程,想与更多的朋友一起交流学习,欢迎加入本站官方QQ群:345733473 ^_^