阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。非阻塞 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该
函数不会阻塞当前线程,而会立刻返回。
用ch=getch();会等待你按下任意键之后,把该键
字符所对应的ASCII码赋给ch,再执行下面的语句。
getch();并非标准C中的函数,不存在C语言中。所以在使用的时候要注意程序的可移植性。国内C语言新手常常使用getch();来暂停程序且不知道此函数来源,建议使用getchar();(如果情况允许)代替此功能或更换一款
编译器。 kbhit()(VC++6.0下为_kbhit())
kbhit() 在执行时,检测是否有按键按下,有按下返回非0值,一般是1 没有按下返回0;是非阻塞函数 getch() 在执行时,检测按下什么键,如果不按键该函数不返回;是阻塞函数 类似地 在Tc2.0中有一个处理键盘输入的函数
bioskey(); int bioskey(int cmd); 当cmd为1时,bioskey()检测是否有键按下。没有键按下时返回0;有键按下时返回按键码( 任何按键码都不为0),但此时并不将检测到的按键码从键盘缓冲队列中清除。 是非阻塞参数。 当cmd为0时,
bioskey()返回键盘缓冲队列中的按键码,并将此按键码从键盘缓冲队列中清 除。如果键盘缓冲队列为空,则一直等到有键按下,才将得到的按键码返回。是阻塞调用。 //个人理解kbhit()有点像
bioskey(1)