複製鏈接
請複製以下鏈接發送給好友

阻塞函數

鎖定
阻塞函數是當這個函數不執行完,函數所在線程就一直停止在這裏不動。
中文名
阻塞函數
外文名
Blocking function
所屬學科
數學
計算機
定    義
不執行完使線程停止的函數

目錄

阻塞函數解釋

阻塞函數就是當這個函數不執行完,函數所在線程就一直停止在這裏不動。

阻塞函數舉例

阻塞調用是指調用結果返回之前,當前線程會被掛起。函數只有在得到結果之後才會返回。有人也許會把阻塞調用和同步調用等同起來,實際上他是不同的。對於同步調用來説,很多時候當前線程還是激活的,只是從邏輯上當前函數沒有返回而已。例如,我們在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)