您的位置:首页 > 其它

实现一个可以阻塞标准输入的模板函数

2009-10-08 13:59 302 查看
逛论坛就是由收获,今天又看到一个有趣的东西,设置标准输个入等待超时,因为比较熟悉linux环境,所以linux下很快用select实现了,但是windows上的select无法监视标准IO的3个句柄,所以郁闷很久,想用钩子又是在太麻烦了,百思不的要领,回过头,发现还有一个kbhit可供使用,真是峰回路转啊,嘿嘿,大家共享:)

#ifndef TIMEINPUT_H__
#define TIMEINPUT_H__

#include <iostream>
#include <time.h>

#ifdef WIN32
#include <conio.h>
#include <windows.h>
#define sleep Sleep
#elif defined _LINUX
#include <unistd.h>
#include <sys/types.h>
#endif

template<class T>
static inline int Tread(T& _input,int _timeout)
{
#ifdef WIN32
time_t begin = time(0);
while (1)
{
if (kbhit())
{
std::cin>>_input;
break;
}
else if (time(0)-_timeout>=begin)
{
return -1;
}
sleep(1);
}

#elif defined _LINUX
fd_set read_set;
FD_ZERO(&read_set);
FD_SET(0,&read_set);
struct timeval time;
time.tv_sec = _timeout;
time.tv_usec = 0;

switch(select(1,&read_set,NULL,NULL,&time))
{
case 0:
case -1:
return -1;
default:
if (FD_ISSET(0,&read_set)>0)
{
std::cin>>_input;
return 0;
}
else
{
return -1;
}
}

#endif
return 0;
}

#endif

int main()
{
char i[90] = {0};
Tread(i,3);
std::cout<<i<<std::endl;
return 0;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐