Linux高级应用(六)多线程编程

2021/9/19 7:37:00

本文主要是介绍Linux高级应用(六)多线程编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、为什么要用多线程?

			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

  • /etc/init.d/rcS [Modified] 87/87 100%

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;
}


这篇关于Linux高级应用(六)多线程编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程