求高手 详解阻塞函数与非阻塞函数的区别。再解释一下getch()和kbhit()的组合应用实例详解

用通俗的语言解释能听懂最好,不要在网上复制的,网上的我都看过了没看懂。好的追分。急!!!我在实际终于到的问题是是getch()在kbhit()下面用,实际运行时好像get... 用通俗的语言解释能听懂最好,不要在网上复制的,网上的我都看过了没看懂。好的追分。急!!!
我在实际终于到的问题是是getch()在kbhit()下面用,实际运行时好像getch()没起左右
展开
 我来答
dnydxw
推荐于2018-04-30 · TA获得超过1.5万个赞
知道大有可为答主
回答量:2942
采纳率:0%
帮助的人:1471万
展开全部
阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同
步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数
据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操
作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,
如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。
非阻塞
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
  getch():
  所在头文件:conio.h
  函数用途:从控制台读取一个字符,但不显示在屏幕上
  函数原型:int getch(void)
  返回值:读取的字符
  例如:
  char ch;或int ch;
  getch();或ch=getch();
  用getch();会等待你按下任意键,再继续执行下面的语句;
  用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。
  易错点:
  1.所在头文件是conio.h。而不是stdio.h。
  2.在使用之前要调用initscr(),结束时要调用endwin()。否则会出现不输入字符这个函数
  也会返回的情况。
  3.在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n)
  1)windows平台下ENTER键会产生两个转义字符 \r\n,因此getch返回13(\r)。
  2)unix、 linux系统中ENTER键只产生 \n ,因此getch返回10(\n)。
  3)MAC OS中ENTER键将产生 \r ,因此getch返回13(\r)。
  getch();并非标准C中的函数,不存在C语言中。所以在使用的时候要注意程序的可移植性。国内C语言新手常常使用getch();来暂停程序且不知道此函数来源,建议使用getchar();(如果情况允许)代替此功能或更换一款编译器。
kbhit()(VC++6.0下为_kbhit())
  功 能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
  用 法:int kbhit(void);
  包含头文件: include <conio.h>
编辑本段程序示例
C语言
  #include<conio.h>
  int main(void)
  {
  cprintf("Press any key to continue:");
  while (!kbhit()) /* do nothing */ ;
  cprintf("\r\nA key was pressed...\r\n");
  return 0;
  }
  下面的代码,如果没有键盘输入程序一直输出Hello World,直到用户按Esc结束
  #include <conio.h>
  #include <stdlib.h>
  int main( void )
  {
  char ch;
  while( !kbhit() )
  {
  cprintf("Hello World\n");
  if( kbhit() )
  ch = getch();
  if( 27 == ch )
  break;
  }
  cprintf("End!\n");
  system("pause");
  return 0;
  }
C++语言
  #include <conio.h>
  #include <iostream>
  using namespace std;
  int main()
  {
  while(!kbhit()) //当没有键按下
  {
  cout<<"无键按下"<<endl;
  }
  cout<<"有键按下"<<endl; //有键按下时输出这
  system("pause");
  }
  kbhit() 在执行时,检测是否有按键按下,有按下返回非0值,一般是1
  没有按下返回0;是非阻塞函数
  getch() 在执行时,检测按下什么键,如果不按键该函数不返回;是阻塞函数
  类似地
  在Tc2.0中有一个处理键盘输入的函数bioskey();
  int bioskey(int cmd);
  当cmd为1时,bioskey()检测是否有键按下。没有键按下时返回0;有键按下时返回按键码(
  任何按键码都不为0),但此时并不将检测到的按键码从键盘缓冲队列中清除。 是非阻塞参数。
  当cmd为0时,bioskey()返回键盘缓冲队列中的按键码,并将此按键码从键盘缓冲队列中清
  除。如果键盘缓冲队列为空,则一直等到有键按下,才将得到的按键码返回。是阻塞调用。
  //个人理解kbhit()有点像bioskey(1)
百度网友df5604ebc8a
2011-07-09 · TA获得超过2701个赞
知道大有可为答主
回答量:4883
采纳率:0%
帮助的人:2726万
展开全部
d++为先用后加,do-while是先执行后判断
d = 9时先执行循环体一次。
判断10>9为真
d++变为10
d = 10 时再执行循环体。
判断10>10为假。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式