linux高级编程.doc_第1页
linux高级编程.doc_第2页
linux高级编程.doc_第3页
linux高级编程.doc_第4页
linux高级编程.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/ 第三天 线程 基本使用方法 /二、线程 1.基本概念 线程 :是一个独立的指令流,是在某个进程中被创建的。它生存在进程资源 拥有独立的控制流,随进程的关闭而关闭 指令流:即代码段,独立是指独立于进程 进程:进程是执行程序的过程,拥有完整的资源。即进程有自已的数据段、堆栈段、代码段 即进程是运行的程序 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段、代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换 线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, 比创建进程小很多 进程内独立的一条运行路线 处理器调度的最小单元,也称为轻量级进程 可以对进程的内存空间和资源进行访问,并与同一进程中的其他线程共享 线程线程相关的执行状态和存储变量放在线程控制表内一个进程可以有多个线程,有多个线程控制表及堆栈寄存器,共享一个用户地址空间 2.线程函数 #include 1)创建线程 int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg); restrict thread :线程的ID号 指针类型,创建完的线程ID写入在这个参数 restrict attr :线程的属性是结构体 pthread_attr_t的指针 用来设置 start_routine :是线程函数的指针,也是线程函数的入口点,创建后马上执行线程函数。 即把输入的实参(函数)当作了独立的指令流 restrict arg :参数列表 用于等待线程的结束,是一个阻塞函数 int pthread_join(pthread_t thread, void *value_ptr); thread : 线程的ID value_ptr:线程的返回值 编译时,必须引入-lpthread 库 gcc -o test test.c -lpthread void* run(void* a) char *p=(char *)a; int i=0; while(i10) printf(thread-run %dn,i+); sleep(1); int main(int argc,char *argv) pthread_t tid; char buf256=aaa; pthread_create(&tid,NULL, run,(void*)buf); pthread_join(tid,NULL); 2)跳出线程的方式 关键点在于结束线程的函数 (1)从线程内用return 跳出线程,线程结束,函数的结束就是线程的结束 (2)在线程内调用pthread_exit函数 void pthread_exit(void *value_ptr) value_ptr是线程的返回值 (3)从线程外面调用pthread_cancel函数 int pthread_cancel(pthread_t thread); thread是线程ID 例: 11 void *thr_fn1(void *arg) 12 return (void*)23;/用return跳出线程 13 14 void *thr_fn2(void *arg) 15 pthread_exit(void*)24); 16 17 void *thr_fn3(void *arg) 18 while(1) sleep(1); 19 20 21 22 int main(int argc,char *argv) 23 void *tret; 24 pthread_t tid1,tid2,tid3; 25 pthread_create(&tid1,NULL,thr_fn1,NULL); 26 pthread_join(tid1,&tret); 27 printf(-1 %dn,tret); 28 pthread_create(&tid2,NULL,thr_fn2,NULL); 29 pthread_join(tid2,&tret); 30 printf(-2 %dn,tret); 31 pthread_create(&tid3,NULL,thr_fn3,NULL); 32 pthread_cancel(tid3); 33 pthread_join(tid3,&tret); 34 printf(-3 %dn,tret); 35 36 return 0; 37 3)线程属性设置 pthread_attr_t attr; /定义结构的变量 pthread_init(&attr); /对属性结构进行初始化,通过函数对结构进行初始化 pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);/添加属性 pthread_create(&tid1,&attr,thr_fn1,NULL); pthread_atrr_destroy(&attr); /销毁属性 . pthread_join(tid1); 练习用QT编写wav音频播放器 思考的问题: 1.如何能自动读取出采样大小、频率、声道,而不需要输入 2.如何在播放时可以让界面正常,且可以点击其它按钮并停止 3.播放器应该包括哪些操作 练习用qt及线程编写wav播放器/*/mplay.c#include #include #include #include #include #include #include #include #include #include #define READSIZE 80struct FILE_FRM pthread_t tid; /线程id long fd; /文件描述符 long start; /声频的起始位置 short channels; /声道 0单声道,1双声道 short format; /采样格式 8位, 16位 short speed; /频率 8k 11.025k 12k 22.05k 37.8k 44.1k long size; /音频数据的大小 long pos; /播放位置 file_frm=0,0,0,0,0,0,0,0;static int isstop=0;static int ispause=0;static FUN_STATE audio_setstate=NULL;/* state 1 开始运行, 0 结束 2 代表传送的是 pos 3 代表总长度值 4 暂停*/-void audio_set(FUN_STATE *fun) audio_setstate=fun;void audio_setvol(int lvol,int rvol) int fd=open(/dev/mixer,O_RDWR); short vol=(lvol8; *rvol= vol & 0xFF; close(fd);static int fileopen(char *filename) char buf256=0; file_frm.fd=open(filename,O_RDONLY); if (file_frm.fd=-1) printf(- open file errn); return -1; file_frm.start=0x28+4; /即头长44 /读文件格式 lseek(file_frm.fd,0x08,0); read(file_frm.fd,buf,4); if (strcmp(buf,WAVE)!=0) qDebug(file is not WAVn); close(file_frm.fd); file_frm.fd=0; return -1; /读声道 lseek(file_frm.fd,0x16,0); read(file_frm.fd,&file_frm.channels,2);/使用时需要-1 /读频率 lseek(file_frm.fd,0x18,0); read(file_frm.fd,&file_frm.speed,2); /采样格式 lseek(file_frm.fd,0x22,0); read(file_frm.fd,&file_frm.format,2); /音频数据长度 不包括头长 lseek(file_frm.fd,0x28,0); read(file_frm.fd,&file_frm.size,4); return 0;void *_play(void *val) isstop=0; ispause=0; struct FILE_FRM *filefrm=(struct FILE_FRM *)val; /读取音频文件头信息* /- qDebug(fd=%d,channels=%d,bits=%d,speed=%d,filefrm-fd,filefrm-channels,filefrm-format,filefrm-speed); char buf256=0; /打开设备 int dsp_fd=open(/dev/dsp,O_RDWR); if (dsp_fd=-1) qDebug(dsp open errn); return (void*)-2; ioctl(dsp_fd,SNDCTL_DSP_STEREO,&filefrm-channels); ioctl(dsp_fd,SNDCTL_DSP_SETFMT,&filefrm-format); ioctl(dsp_fd,SNDCTL_DSP_SPEED,&filefrm-speed);/* state 1 开始运行, 0 结束 2 代表传送的是 pos 3 代表总长度值 4 暂停*/ audio_setstate(1,0); /开始运行 /S=R(采样频率Hz )D(录音时间)r(量化位数(位)) 声道数8 /S: 字节; R:HZ; D:录音时间S; r:量化位数bit /D=Size/(R*r*c/8); /t=size/(44100*8*2/8); /或 WAV文件的字节数/每秒=采样频率(Hz)量化位数(位) 声道数/8 /s=44100*8*2/8; /s是速度 /t=size/s; audio_setstate(3,filefrm.size/(filefrm.speed * filefrm.format *filefrm.channels/8); /音频数据长度 for(filefrm.pos=0;filefrm.pos filefrm.size;) audio_setstate(2,filefrm.pos/(filefrm.speed * filefrm.format *filefrm.channels/8); /播放位置 if(isstop) break; while (ispause) audio_setstate(4,0);/暂停 usleep(50000); int len=read(filefrm.fd,buf,READSIZE); write(dsp_fd,buf,len); filefrm.pos+=len; audio_setstate(0,0); /结束 printf(play overn); close(dsp_fd); close(filefrm.fd); filefrm.fd=0; return 0;void audio_play(char *buf) if (fileopen(char *filename)!=0) return; pthread_create(&tid,NULL,&_play,(void*)buf);void audio_stop() if (filefrm.fd 0) close(filefrm.fd); filefrm.fd=0; void audio_pause() if (filefrm.fd =0) return; ispause=1;void audio_replay() if (filefrm.fd =0) return; ispause=0; audio_setstate(1,0); /开始运行void audio_playfrom(int pos)/从指定位置播放 if (filefrm.fd filefrm.size?filefrm.size:pos; qDebug(- new pos %d,wavpos); lseek(filefrm.fd,filefrm.pos+filefrm.start,0); ispause=0;void audio_fastpre(int diff)/快进 if (filefrm.fd =0) return; audio_playfrom(filefrm.pos-diff);void audio_fastnex(int diff)/快退 if (filefrm.fd setMaximum(val); else if(state=2) /播放位置状态显示 timeLd-setValue(val); else if (state=4)/暂停状态 pauseBtn-setEnabled(false); playBtn-setEnabled(true); else if (state=1) /播放状态 ui-pauseBtn-setEnabled(true); ui-playBtn-setEnabled(false); ui-nextBtn-setEnabled(true); ui-preBtn-setEnabled(true); ui-stopBtn-setEnabled(true); else if(state=0) /停止状态 pauseBtn-setEnabled(false); playBtn-setEnabled(true); nextBtn-setEnabled(false); preBtn-setEnabled(false); stopBtn-setEnabled(false); timeLd-setValue(0); Filerw:init()Filerw:Filerw(QWidget *parent) : QWidget(parent) init();/创建组件 code=QTextCodec:codecForLocale(); pw= this; audio_set(statefun);int lvol,rvol;audio_getvol(&lvol,&rvol);volSLd-setValue(lvol+rvol)/2); / statefun(0,0);Filerw:Filerw()void Filerw:on_playBtn_clicked() /播放 if (isplaying=0) if (fileName=) return; char *file=code-fromUnicode(fileName).data(); audio_play(file); else if (ispause=1) audio_replay(); void Filerw:on_pauseBtn_clicked() audio_pause();void Filerw:on_ope

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论