ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2021-09-18 11:33:39  阅读:147  来源: 互联网

标签:Linux color void 编程 xy 线程 pthread show 多线程


一、为什么要用多线程?

			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,color,void,编程,xy,线程,pthread,show,多线程
来源: https://blog.csdn.net/weixin_43909373/article/details/120346064

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有