解釋
阻塞函式就是當這個函式不執行完,函式所線上程就一直停止在這裡不動。
舉例
阻塞阻塞調用是指調用結果返回之前,當前執行緒會被掛起。函式只有在得到結果之後才會返回。有人也許會把阻塞調用和同步調用等同起來,實際上他是不同的。對於同步調用來說,很多時候當前執行緒還是激活的,只是從邏輯上當前函式沒有返回而已。例如,我們在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)