首先,阐述一下这个问题。
在嵌入式学习中,学完网络编程,那肯定是要做一些游戏,不同开发板通信一下。
那么,在触摸屏与网络(以下称之套接字)读取之间肯定会有其一阻塞了,让另一个不能进行读取。
当然,你可以尝试使用 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 的。
以上这种方式,就可以解决触摸屏和套接字读取的相互阻塞带来的麻烦。虽然代码略多,慢慢再找有更好的方法解决。