c語言鼠標(biāo)捕獲非阻塞函數(shù) C語言鼠標(biāo)函數(shù)

c語言的recv()非阻塞方法怎么弄哦

需要將recv設(shè)置超時(shí),Linux下設(shè)置超時(shí)如下:

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、祿豐網(wǎng)站維護(hù)、網(wǎng)站推廣。

//設(shè)置發(fā)送超時(shí)

struct timeval timeout={3,0};//3s

setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)timeout,sizeof(struct timeval));

//設(shè)置接收超時(shí)

setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)timeout,sizeof(struct timeval));

windows下設(shè)置超時(shí)如下:

int timeout = 3000; //3s

int ret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,timeout,sizeof(timeout));

int ret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,timeout,sizeof(timeout));

windows下C語言非阻塞方式讀取鍵盤緩沖區(qū)

有所不同。服務(wù)器是網(wǎng)絡(luò)的節(jié)點(diǎn),存儲(chǔ)、處理網(wǎng)絡(luò)上80%的數(shù)據(jù)、信息,在網(wǎng)絡(luò)中起到舉足輕重的作用。它們是為客戶端計(jì)算機(jī)提供各種服務(wù)的高性能的計(jì)算機(jī),其高性能主要表高速度的運(yùn)算能力、長時(shí)間的可靠運(yùn)行、強(qiáng)大的外部數(shù)據(jù)吞吐能力等方面。服務(wù)器的構(gòu)成與普通電腦類似,

C語言鼠標(biāo)操作

我之前給別人寫過一個(gè)打地鼠的小游戲,就是用鼠標(biāo)操作的。發(fā)給你參考下。代碼很簡單。

主要函數(shù)我在下方說明了,但更多信息你必須自己百度看,一言兩語說不完。

SetConsoleCursorPosition函數(shù)可以定位光標(biāo)位置,也就是文字內(nèi)容顯示的起點(diǎn)。

ReadConsoleInput(HANDLE hConsoleInput,*INPUT_RECORD lpBuffer,DWORD nLength,

DWORD lpNumberOfEventsRead)函數(shù)可以獲取鼠標(biāo)的操作信息。

調(diào)用過上面函數(shù)后,lpBuffer由于是傳址,所以其地址里的值就包含了鼠標(biāo)信息。

lpBuffer.EventType == MOUSE_EVENT //判斷是鼠標(biāo)事件

lpBuffer.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED//判斷是鼠標(biāo)左鍵點(diǎn)擊

兩個(gè)判斷一起就是鼠標(biāo)左鍵點(diǎn)擊的判斷,其他事件參數(shù)你可以自己網(wǎng)上找。

#include?stdio.h

#include?stdlib.h

#include?windows.h

#include?conio.h

#include?time.h

#include?string.h

#include?malloc.h

#define?gSizek?30//區(qū)域大小寬度

#define?gSizeg?20//區(qū)域大小高度

#define?gBegin?3//活動(dòng)區(qū)域起始行

int?main()

{

int?t=0,s0,s1,i,j,count=0,fen=0,row=0,clo=0;

char?gameA[gSizeg][gSizek+1],fSave[10]={0};

SetConsoleTitle("打地鼠");

HANDLE?hInput?=?GetStdHandle(STD_INPUT_HANDLE);?//?獲取標(biāo)準(zhǔn)輸入設(shè)備句柄

INPUT_RECORD?inRec;

DWORD?res;

COORD?p0;

p0.X=0;

p0.Y=0;

srand(time(0));

s0=?time(NULL);

strcpy(gameA[0],"????????????GAME");

strcpy(gameA[1],"未命中次數(shù):0,計(jì)分:000000");

for(i=gBegin-1;igSizeg;i++)

{

for(j=0;jgSizek+1;j++)

{

if(igBegin-1??igSizeg-1??j0??jgSizek-1)

gameA[i][j]='?';

else

gameA[i][j]=4;

if(j==gSizek)

gameA[i][j]=0;

}

}

for(i=0;igSizeg;i++)

printf("%s\n",gameA[i]);

while?(1)

{

if(t=3)

{

if(row0??clo0)

gameA[row][clo]='?';

row=rand()%(gSizeg-1);

clo=rand()%(gSizek-1);

s0=?time(NULL);

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p0);

if(row3)

row=4;

if(clo1)

clo=1;

gameA[row][clo]=2;

for(i=0;igSizeg;i++)

{

//gameA[i][gSizeg+1]=0;

printf("%s\n",gameA[i]);

}

}

if(count==3)

{

p0.X=10;

p0.Y=8;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p0);

printf("GAME?OVER!");

break;

}

s1=?time(NULL);

t=s1-s0;

ReadConsoleInput(hInput,?inRec,?1,?res);

if?(inRec.EventType?==?MOUSE_EVENT??inRec.Event.MouseEvent.dwButtonState?==?FROM_LEFT_1ST_BUTTON_PRESSED)?//鼠標(biāo)左鍵

{

if(inRec.Event.MouseEvent.dwMousePosition.X==clo??inRec.Event.MouseEvent.dwMousePosition.Y==row)

{

if(fen==0)

fen=1;

if(fen999999)

fen=999999;

else

fen=fen*2;

sprintf(fSave,"%06d",fen);

gameA[1][18]=0;

strcat(gameA[1],fSave);

}

else

{

count++;

fen=0;

gameA[1][11]=count+'0';

}

t=4;

}

}

while(1);

return?0;

}

求高手 詳解阻塞函數(shù)與非阻塞函數(shù)的區(qū)別。再解釋一下getch()和kbhit()的組合應(yīng)用實(shí)例詳解

阻塞

阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起。函數(shù)只有在得到結(jié)果之后才會(huì)返回。有人也許會(huì)把阻塞調(diào)用和同步調(diào)用等同起來,實(shí)際上他是不同的。對(duì)于同

步調(diào)用來說,很多時(shí)候當(dāng)前線程還是激活的,只是從邏輯上當(dāng)前函數(shù)沒有返回而已。例如,我們?cè)贑Socket中調(diào)用Receive函數(shù),如果緩沖區(qū)中沒有數(shù)

據(jù),這個(gè)函數(shù)就會(huì)一直等待,直到有數(shù)據(jù)才返回。而此時(shí),當(dāng)前線程還會(huì)繼續(xù)處理各種各樣的消息。如果主窗口和調(diào)用函數(shù)在同一個(gè)線程中,除非你在特殊的界面操

作函數(shù)中調(diào)用,其實(shí)主界面還是應(yīng)該可以刷新。socket接收數(shù)據(jù)的另外一個(gè)函數(shù)recv則是一個(gè)阻塞調(diào)用的例子。當(dāng)socket工作在阻塞模式的時(shí)候,

如果沒有數(shù)據(jù)的情況下調(diào)用該函數(shù),則當(dāng)前線程就會(huì)被掛起,直到有數(shù)據(jù)為止。

非阻塞

非阻塞和阻塞的概念相對(duì)應(yīng),指在不能立刻得到結(jié)果之前,該函數(shù)不會(huì)阻塞當(dāng)前線程,而會(huì)立刻返回。

getch():

所在頭文件:conio.h

函數(shù)用途:從控制臺(tái)讀取一個(gè)字符,但不顯示在屏幕上

函數(shù)原型:int getch(void)

返回值:讀取的字符

例如:

char ch;或int ch;

getch();或ch=getch();

用getch();會(huì)等待你按下任意鍵,再繼續(xù)執(zhí)行下面的語句;

用ch=getch();會(huì)等待你按下任意鍵之后,把該鍵字符所對(duì)應(yīng)的ASCII碼賦給ch,再執(zhí)行下面的語句。

易錯(cuò)點(diǎn):

1.所在頭文件是conio.h。而不是stdio.h。

2.在使用之前要調(diào)用initscr(),結(jié)束時(shí)要調(diào)用endwin()。否則會(huì)出現(xiàn)不輸入字符這個(gè)函數(shù)

也會(huì)返回的情況。

3.在不同平臺(tái),輸入回車,getch()將返回不同數(shù)值,而getchar()統(tǒng)一返回10(即\n)

1)windows平臺(tái)下ENTER鍵會(huì)產(chǎn)生兩個(gè)轉(zhuǎn)義字符 \r\n,因此getch返回13(\r)。

2)unix、 linux系統(tǒng)中ENTER鍵只產(chǎn)生 \n ,因此getch返回10(\n)。

3)MAC OS中ENTER鍵將產(chǎn)生 \r ,因此getch返回13(\r)。

getch();并非標(biāo)準(zhǔn)C中的函數(shù),不存在C語言中。所以在使用的時(shí)候要注意程序的可移植性。國內(nèi)C語言新手常常使用getch();來暫停程序且不知道此函數(shù)來源,建議使用getchar();(如果情況允許)代替此功能或更換一款編譯器。

kbhit()(VC++6.0下為_kbhit())

功 能及返回值: 檢查當(dāng)前是否有鍵盤輸入,若有則返回一個(gè)非0值,否則返回0

用 法:int kbhit(void);

包含頭文件: include conio.h

編輯本段程序示例

C語言

#includeconio.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結(jié)束

#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()) //當(dāng)沒有鍵按下

{

cout"無鍵按下"endl;

}

cout"有鍵按下"endl; //有鍵按下時(shí)輸出這

system("pause");

}

kbhit() 在執(zhí)行時(shí),檢測(cè)是否有按鍵按下,有按下返回非0值,一般是1

沒有按下返回0;是非阻塞函數(shù)

getch() 在執(zhí)行時(shí),檢測(cè)按下什么鍵,如果不按鍵該函數(shù)不返回;是阻塞函數(shù)

類似地

在Tc2.0中有一個(gè)處理鍵盤輸入的函數(shù)bioskey();

int bioskey(int cmd);

當(dāng)cmd為1時(shí),bioskey()檢測(cè)是否有鍵按下。沒有鍵按下時(shí)返回0;有鍵按下時(shí)返回按鍵碼(

任何按鍵碼都不為0),但此時(shí)并不將檢測(cè)到的按鍵碼從鍵盤緩沖隊(duì)列中清除。 是非阻塞參數(shù)。

當(dāng)cmd為0時(shí),bioskey()返回鍵盤緩沖隊(duì)列中的按鍵碼,并將此按鍵碼從鍵盤緩沖隊(duì)列中清

除。如果鍵盤緩沖隊(duì)列為空,則一直等到有鍵按下,才將得到的按鍵碼返回。是阻塞調(diào)用。

//個(gè)人理解kbhit()有點(diǎn)像bioskey(1)

C++非阻塞鍵盤緩沖區(qū)輸入檢測(cè)或讀取函數(shù)是什么?

如果是linux的話可以將輸入設(shè)備設(shè)置為非阻塞模式就可以了,用 fcntl 函數(shù):

fcntl( 0, F_SETFL, O_NONBLOCK);

在windows上好像沒有這個(gè)函數(shù),不知道 DeviceIoControl 函數(shù)有沒有這個(gè)功能,如果沒有的話可以構(gòu)造一個(gè)線程去讀標(biāo)準(zhǔn)輸入,1秒鐘內(nèi)無響應(yīng)就繼續(xù)執(zhí)行,偽代碼如下:

Event e;

char chr;

DWORD WINAPI ReadStdin( void ){

//讀標(biāo)準(zhǔn)輸入

}

void CheckStdIn( void ){

WaitEvent( e ); //阻塞,當(dāng)主線程有需求時(shí)才讀

chr= 0;

CreateThread( ReadStdin );

WaitThread; //等1秒(或更短)

}

void main(){

loop = 100;

while( 0 loop--){

CheckStdIn();

if ( chr ==0 ){

//no input

} else {

//get input

}

}

}

分享標(biāo)題:c語言鼠標(biāo)捕獲非阻塞函數(shù) C語言鼠標(biāo)函數(shù)
分享地址:http://muchs.cn/article2/hgijoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站內(nèi)鏈、外貿(mào)建站App設(shè)計(jì)、響應(yīng)式網(wǎng)站靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)