还是因为项目的原因,我一直在想怎么解决之前遇到的问题,程序顺序执行却要求在中间延时执行某个函数,我不想用信号,最后咨询了朋友,他告诉我用多线程。我想了想, 我已经用了回调了,似乎也用不了回调了。就尝试下多线程吧。
下面是我自己总结的一个线程使用方法,线程可以无限次数的开启,因为是设置成了程序运行完成,或者意外发生,均会自动销毁线程。也许不是太安全,但是好用。
这里我放上一个函数的代码。
int touch_piano()
{
int x , y , cont = 0 ;
int fd_ts = open("/dev/input/event0", O_RDONLY);
if ( fd_ts < 0 )
{
perror("open event0 error ");
return -1 ;
}
struct node p;
int T=0,Mentra=0;
struct input_event ts_event ;
int flag,i,j;
int count=0;
int vis[6000];
while (1)
{
read(fd_ts , &ts_event , sizeof(struct input_event));
if (EV_ABS == ts_event.type)
{
if (ABS_X == ts_event.code)
{
x = 800*ts_event.value/1024;
}
else if (ABS_Y == ts_event.code)
{
y = 480*ts_event.value/600;
}
}
if(ts_event.type==1)
{
if(ts_event.code ==330)
{
if(ts_event.value==1){
flag=1;
}
if(ts_event.value==0)
{
T=0;
flag=0;
Mentra=0;
continue;
}
}
}
if(flag==1)
{
p.x = x;
p.y = y;
T = judge_key(p);
if(T>0&&T<13)
{
if(T!=Mentra)
{
// void *X;
// pthread_join(tid,&X);
// pthread_join(tid2,&X);
pthread_t tid;
pthread_t tid2;
Mentra = T;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
// pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
i=pthread_create(&tid,&attr,playkey,(void *)Mentra);
j=pthread_create(&tid2,&attr,changekey,(void *)Mentra);
if(i!=0)
{
perror("error");
}
if(j!=0)
{
perror("error");
}
printf("count:%d\n",count);
}
}
if(T==13)
{ T=0;
break;
}
}
}
close(fd_ts);
return T;
}
pthread_t tid;
pthread_t tid2;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
请注意这里是重中之重