重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

c语言鼠标捕获非阻塞函数 C语言鼠标函数

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

需要将recv设置超时,Linux下设置超时如下:

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、网页空间、营销软件、网站建设、禄丰网站维护、网站推广。

//设置发送超时

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

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

//设置接收超时

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

windows下设置超时如下:

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语言非阻塞方式读取键盘缓冲区

有所不同。服务器是网络的节点,存储、处理网络上80%的数据、信息,在网络中起到举足轻重的作用。它们是为客户端计算机提供各种服务的高性能的计算机,其高性能主要表高速度的运算能力、长时间的可靠运行、强大的外部数据吞吐能力等方面。服务器的构成与普通电脑类似,

C语言鼠标操作

我之前给别人写过一个打地鼠的小游戏,就是用鼠标操作的。发给你参考下。代码很简单。

主要函数我在下方说明了,但更多信息你必须自己百度看,一言两语说不完。

SetConsoleCursorPosition函数可以定位光标位置,也就是文字内容显示的起点。

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

DWORD lpNumberOfEventsRead)函数可以获取鼠标的操作信息。

调用过上面函数后,lpBuffer由于是传址,所以其地址里的值就包含了鼠标信息。

lpBuffer.EventType == MOUSE_EVENT //判断是鼠标事件

lpBuffer.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED//判断是鼠标左键点击

两个判断一起就是鼠标左键点击的判断,其他事件参数你可以自己网上找。

#include stdio.h

#include stdlib.h

#include windows.h

#include conio.h

#include time.h

#include string.h

#include malloc.h

#define gSizek 30//区域大小宽度

#define gSizeg 20//区域大小高度

#define gBegin 3//活动区域起始行

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); // 获取标准输入设备句柄

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],"未命中次数:0,计分: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) //鼠标左键

{

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;

}

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

阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同

步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在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语言

#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结束

#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)

C++非阻塞键盘缓冲区输入检测或读取函数是什么?

如果是linux的话可以将输入设备设置为非阻塞模式就可以了,用 fcntl 函数:

fcntl( 0, F_SETFL, O_NONBLOCK);

在windows上好像没有这个函数,不知道 DeviceIoControl 函数有没有这个功能,如果没有的话可以构造一个线程去读标准输入,1秒钟内无响应就继续执行,伪代码如下:

Event e;

char chr;

DWORD WINAPI ReadStdin( void ){

//读标准输入

}

void CheckStdIn( void ){

WaitEvent( e ); //阻塞,当主线程有需求时才读

chr= 0;

CreateThread( ReadStdin );

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

}

void main(){

loop = 100;

while( 0 loop--){

CheckStdIn();

if ( chr ==0 ){

//no input

} else {

//get input

}

}

}


标题名称:c语言鼠标捕获非阻塞函数 C语言鼠标函数
转载来于:http://cqcxhl.com/article/hgijoc.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP