| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2982 人关注过本帖
标题:有没有像kbhit()的非阻塞函数
只看楼主 加入收藏
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:7 
如果你创建的是一个console程序,使用scanf从缓冲区读取数据的话,因为scanf是一个阻塞函数,所以会一直等到用户的输入,否则会一直等待,你可以使用异步IO来解决这个问题,我只给你提个大概的思路,你自己实现:
你可以使用CreateFile打开标准输入缓冲区的句柄(这里还有一个函数GetStdHandle,但是好像不支持异步模式),并把文件标志设置为:FILE_FLAG_OVERLAPPED,这样打开的缓冲区支持异步读取方式,然后你就可以使用ReadFile来读取其中的数据,具体的细节上网找一下资料!
收到的鲜花
  • silvers2012-04-13 22:52 送鲜花  1朵   附言:是这个道理

愿用余生致力编程
2012-04-13 22:07
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
回复 10楼 TonyDeng
我也不知道该怎么说了

酱油实习生
2012-04-14 12:20
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
回复 11楼 我菜119
好复杂啊,不过试一下吧,也许其他地方会用到,谢谢

酱油实习生
2012-04-14 12:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用墨清扬在2012-4-14 12:20:37的发言:

我也不知道该怎么说了
我的意思是说,根据你的真实需求,其实有很多种实现方法,不是在一棵树上吊死的。可以在程序中自设输入缓冲区,进程共享,不必非用系统的缓冲区,只要有一个进程不断扫描_kbhit()把每一个按键都转存到自设缓冲区,里面有多少数据自己全部清楚,不必非要向系统申请。

其实_kbhit()在本质上不过是检测输入缓冲区中是否有数据,有就返回真,你在读数周期到达的时候,一个循环不断地读,直到_kbhit()为假,就能把暂存在键盘输入缓冲区中的数据全部取出。这样问题只是如果有多读的数据,无法返还出去而已,如果真要考虑这种读多了的问题,还是把缓冲区转存的好,数据是可以自己交换的。

用_kbhit()加_getch(),是非阻塞的处理办法,也是多任务的首选手段,哪有人用scanf()的道理。

[ 本帖最后由 TonyDeng 于 2012-4-14 12:30 编辑 ]

授人以渔,不授人以鱼。
2012-04-14 12:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
scanf()的最佳应用环境是从字符流中提取数据,也是这个函数本身就是流函数的根本原因,天生就是在这种环境中使用的。人机交互时,没有人设计用scanf()的。

授人以渔,不授人以鱼。
2012-04-14 12:34
zanzan1986
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:140
注 册:2011-2-22
收藏
得分:0 
有一个函数有这种功能,进程在等待的话就会把它挂起。不过得声明事件句柄。
HANDLE hEvent;
那个函名我忘了怎么写了。不好意思啊!
2012-04-15 00:47
快速回复:有没有像kbhit()的非阻塞函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018104 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved