嵌入式开发板C语言编写之从触摸屏与网络编程不同线程文件描述符的读取

首先,阐述一下这个问题。

在嵌入式学习中,学完网络编程,那肯定是要做一些游戏,不同开发板通信一下。

那么,在触摸屏与网络(以下称之套接字)读取之间肯定会有其一阻塞了,让另一个不能进行读取。

当然,你可以尝试使用 select 函数和 poll 函数来建立容器,添加文件描述符到其中。

要是有这样的方法解决就不会有这篇文章。

所以,我遇到的情况是使用 select 函数再阻塞状态下触摸一下触摸屏出现多次读取的情况,才出现以下解决方式。

当然,也有很多解决方法,我这是其中之一。

直接上代码:

首先有一个触摸屏读取线程:

int tsx, tsy;
void *ts_run(void *arg)
{
	input_xy point;
	while(1)
	{
		point = input();
		tsx = point.x;
		tsy = point.y;
		printf("x:%d---y:%d\n", tsx, tsy);
	}
}
input 函数就是单单阻塞读取触摸屏的函数,返回一个struct point {int x; int y;};的结构体;

这样,程序会不停地等待你触摸,每读一次数据保存一次。

在读取套接字描述符的线程中,使用无阻塞 select 函数进行对套接字获取数据

int ox, oy, ret;
char buf[512] = {0};
fd_set readfds;
struct timeval time;
bzero(&time, sizeof(struct timeval));
while(1)
{
	do
	{
		FD_ZERO(&readfds);
		//FD_SET(tsfd, &readfds);
		FD_SET(sockfd, &readfds);
		ret = select(sockfd+1, &readfds, NULL, NULL, &time);
	} while(ox==tsx && oy==tsy && !FD_ISSET(sockfd, &readfds));
	if(ret < 0)
	{
		perror("select error");
	}
	ox = tsx; oy = tsy;
	if(FD_ISSET(sockfd, &readfds) && ret>0)
	{
		tsx = -1;tsy = -1;
		bzero(buf, 512);
		ret = read(sockfd, buf, 512);
		if(ret <= 0) 
		{
			perror("server boom");
			exit(-1);
		}
		printf("%s\n", buf);
	}
}

红色代码部分,是为防止触摸数据多次使用而写的。

绿色代码部分,是为防止套接字错误读取而写的。

这里也做以下 select 函数的说明:

 select 在无阻塞的情况下,若果fd_set 容器下的文件描述符没有内容,是返回 0 的。

以上这种方式,就可以解决触摸屏和套接字读取的相互阻塞带来的麻烦。虽然代码略多,慢慢再找有更好的方法解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值