线程
当有两个或两个以上的功能的必须处在死循环中,且要同时运行的时候,就可以考虑给其中的功能起一个线程
函数
//头文件
#include <pthread.h>
//申请一个线程号
pthread_t tid;
//编译时要连接对应的线程库文件:-pthread
线程的创建
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg);
//参数
thread:线程号
attr:线程的属性,没有就NULL
start_routine:线程的执行函数
arg:线程的执行函数启动时传递的参数,没有就NULL
线程的回收(等线程死了,回收资源)
int pthread_join(pthread_t thread,void *retval);
//参数
thread:线程号
retval:线程函数参数的返回值,没有就NULL
线程的取消(杀了线程,没有回收资源)
int pthread_cancel(pthread_t thread);
//参数
thread:线程号
线程的退出(杀死线程,回收资源)
void pthread_exit(void *retval);
//参数
retval:线程函数参数的返回值,没有就NULL
//函数为int类型有返回值
成功返回0
失败返回错误数字,-1、-2等
示例代码
//头文件
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
//申请一个线程号
pthread_t tid;
void *gesture(void *arg)
{
while(1)
{
printf("线程\n");
sleep(3);
}
}
int main(int argc, char const *argv[])
{
pthread_create(&tid,NULL,gesture,NULL);//创建线程
while(1)
{
printf("主进程\n");
sleep(1);
}
return 0;
pthread_exit(NULL);//线程的退出
}
//暂停线程
flag_tid=0;//1杀线程,0创建线程
在一个死循环中,if(!flag_tid)pthread_create(&ad_tid,NULL,gesture,NULL);//创建线程
void *gesture(void *arg)
{
while(1)
{
sleep(2);
if(flag_tid)pthread_exit(NULL);//杀死线程
}
}
//在需要进行下一步的那段代码中写,用来确认线程暂停,若未暂停会卡在这里
if (pthread_join(ad_tid, NULL) != 0) perror("pthread_join");
音、视频播放
- 音频播放工具:madplay
- 视频播放工具:mplayer
将madplay和mplayer上传到开发板中,移动到/bin目录下,修改权限
在Secure CRT中输入命令:
//播放音乐
madplay 1.mp3 (若加“&”则表示后台播放)
//暂停播放
killall -SIGSTOP madplay
//继续播放
killall -SIGCONT madplay
//结束播放
killall -SIGKILL madplay
//播放视频
mplayer -slave -quiet -geometry 0:0 -zoom -x 800 -y 480 d.avi
-slave:使用slave命令来控制视频
-quiet:不输出多余信息
-geometry 0:0:指定播放的起始坐标
-zoom:允许视频缩放
-zoom -x 800 -y 480:指定视频播放帧宽度(x)、高度(y)
d.avi:视频文件的文件名(或者mp4,质量不能太高)
//暂停播放
killall -SIGSTOP mplayer
//继续播放
killall -SIGCONT mplayer
//结束播放
killall -SIGKILL mplayer
在程序中实现播放音频、视频
system()函数
system("madplay 1.mp3");
char cmd[64]="mplayer -slave -quiet -geometry 0:0 -zoom -x 800 -y 480 d.avi";
system(cmd);