64,648
社区成员
发帖
与我相关
我的任务
分享
// 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;
}