一、为什么要用多线程?
else if(60<xy.x && xy.x<300 && 240<xy.y && xy.y<300)//进入液晶屏检测 { printf("enter LCD checking\n"); while(1) { lcd_show_color(RED); xy = get_ts_xy();//阻塞 else if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回 { printf("return control UI\n"); xy.x=0;xy.y=0; } sleep(1); lcd_show_color(GREEN); xy = get_ts_xy(); else if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回 { printf("return control UI\n"); xy.x=0;xy.y=0; } sleep(1); xy = get_ts_xy(); else if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回 { printf("return control UI\n"); xy.x=0;xy.y=0; } lcd_show_color(BLUE); xy = get_ts_xy(); else if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回 { printf("return control UI\n"); xy.x=0;xy.y=0; } sleep(1); lcd_show_color(WHITE); xy = get_ts_xy(); else if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回 { printf("return control UI\n"); xy.x=0;xy.y=0; } sleep(1); lcd_show_color(BLACK); xy = get_ts_xy(); else if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回 { printf("return control UI\n"); xy.x=0;xy.y=0; } sleep(1); } xy.x=0;xy.y=0; }
获取触摸屏坐标的时候,如果触摸屏没有按下的动作,读取触摸屏坐标的过程会产生阻塞,循环显示单色就不能自动循环。
========================================================================================================
二、如何解决问题?
void show_color(void) //循环显示单色的子线程
{
while(1)
{
lcd_show_color(RED);
sleep(1);
lcd_show_color(GREEN); sleep(1); lcd_show_color(BLUE); sleep(1); lcd_show_color(WHITE); sleep(1); lcd_show_color(BLACK); sleep(1); }
}
main(void) //主线程
{
…
else if(60<xy.x && xy.x<300 && 240<xy.y && xy.y<300)//进入液晶屏检测
{
printf(“enter LCD checking\n”);
创建一个子线程—>循环播放单色(show_color())
while(1)
{
xy = get_ts_xy();//阻塞,只是主线程阻塞,子线程还是可以继续运行的
if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回
{
printf(“return control UI\n”);
//使子线程show_color()推出,结束循环显示单色
xy.x=0;xy.y=0;
break;//推出显示单色的界面,进入控制界面。
}
}
xy.x=0;xy.y=0;
}
}
========================================================================================
三、线程的处理函数
1、线程的创建
在一个线程中可以创建另一个线程,原来的线程通常叫做主线程,新创建的线程叫做子线程。主线程和子线程都属于同一个进程。主线程和子线程之间共享资源(全局变量、堆、栈、寄存器、内存、文件、…)。如果主线程退出,该主线程创建的子线程都会退出。
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
Compile and link with -pthread.
参数说明:
pthread_t *thread ---- 创建的子线程的ID,32bits的无符号整数,ID也是有系统分配的。
const pthread_attr_t *attr ---- 线程的属性,可以不用,为NULL
void *(*start_routine) (void *) ------ 创建的子线程执行的函数
void *arg ----- 向子线程运行函数传递的参数
返回值:
On success, pthread_create() returns 0; on error, it returns an error number
2、线程的退出
我们在一个线程中,可以让另外一下线程退出。
#include <pthread.h>
int pthread_cancel(pthread_t thread);
参数:
pthread_t thread退出线程的ID。
3、线程自己退出
#include <pthread.h>
void pthread_exit(void *retval);
4、获取线程ID
#include <pthread.h>
pthread_t pthread_self(void);
5、线程等待函数
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
在主线程中调用这个函数。等待子线程退出。如果子线程不退出,调用这个函数的主线程就一直等待。
注意:
编译多线程程序的时候,需要使用-lpthread
===================================================================================
四、解决方法2
struct ts_xy xy; //全局变量—主线程和子线程共享的
void *ts_thread(void *)—获取触摸屏坐标
{
while(1)
{
xy = get_ts_xy();//对全局变量进行赋值
}
}
main(void)//主线程—使用触摸屏坐标
{
创建一个子线程ts_thread()—获取触摸屏的坐标
.............................................................. else if(60<xy.x && xy.x<300 && 240<xy.y && xy.y<300)//进入液晶屏检测 { printf("enter LCD checking\n"); while(1) { lcd_show_color(RED); else if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回 { printf("return control UI\n"); xy.x=0;xy.y=0; } sleep(1); lcd_show_color(GREEN); else if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回 { printf("return control UI\n"); xy.x=0;xy.y=0; } sleep(1); else if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回 { printf("return control UI\n"); xy.x=0;xy.y=0; } lcd_show_color(BLUE); else if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回 { printf("return control UI\n"); xy.x=0;xy.y=0; } sleep(1); lcd_show_color(WHITE); else if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回 { printf("return control UI\n"); xy.x=0;xy.y=0; } sleep(1); lcd_show_color(BLACK); else if(700<xy.x && xy.x<800 && 0<xy.y && xy.y<50)//返回 { printf("return control UI\n"); xy.x=0;xy.y=0; } sleep(1); } xy.x=0;xy.y=0; }
}
如何关闭试验箱自动运行的程序(如何加入自己的程序,让试验箱自动运行)
1、嵌入式Linux(试验箱启动过程)
上电—>运行启动代码(类似于BIOS),也叫bootloader,通常使用u-boot—>启动加载Linux内核—>挂载rootfs(shell命令、Linux配置、设备文件、运行Linux应用程序的库、…)---->运行配置Linux系统环境变量的脚本/etc/init.d/rcS(或者/etc/profile)---->启动应用程序
2、如何关闭实验箱自动运行的应用程序
1)使用vi打开/etc/init.d/rcS文件
vi是一个Linux自带的文本编辑器,类似于vim
注意:vi的使用见P5
[root@FriendlyARM /]# vi /etc/init.d/rcS
rcS文件的最后:
/bin/qtopia & ------------>在后台运行了一个Linux应用程序
echo " " > /dev/tty1
echo “Starting Qtopia, please waiting…” > /dev/tty1
我们要注释掉这三行。
2)首先输入i键,使vi由命令模式转成插入模式
只有在插入模式下,才可以修改文件。使用#注释掉下面三行。
#/bin/qtopia &
#echo " " > /dev/tty1
#echo “Starting Qtopia, please waiting…” > /dev/tty1
I /etc/init.d/rcS [Modified] 87/87 100%
3)输入“Esc”键,退出插入模式,返回命令模式
#/bin/qtopia &
#echo " " > /dev/tty1
#echo “Starting Qtopia, please waiting…” > /dev/tty1
4)保存退出
输入":wq"
#/bin/qtopia &
#echo " " > /dev/tty1
#echo “Starting Qtopia, please waiting…” > /dev/tty1
:wq
5)重启
开发板只会显示开机界面,不会进入QT界面
#include <stdio.h> #include <pthread.h> /****子线程****/ unsigned int count = 0; void *show_color(void *arg) { while(1) { count ++; sleep(1); } } /****主线程****/ int main(void) { pthread_t tid_color; int ret; ret = pthread_create(&tid_color, NULL, show_color, NULL); if(ret < 0) { perror("color thread create error"); return -1; } while(1) { printf("count =%d\n",count); if(count == 10) pthread_cancel(tid_color); } return 0; }