项目名称
Mplayer
运行效果

功能
基础功能
- 播放歌曲文件
- 通过按钮控制播放、暂停、上一首、下一首
- 显示歌词列表,当前播放歌曲反显,点击对应歌曲能切换
- 显示歌曲信息(歌曲总长度、歌曲当前播放时间、歌曲进度百分比、歌曲名字、歌曲艺术家)
- 显示对应的歌词,并与歌曲同步
- 歌曲结束时自动切歌
(基础功能全部实现)
创新功能
- 关闭窗口时会自动关闭Mplayer子进程
存在问题
- 显示歌词的label控件不可改变字体大小,否则在显示的歌词句末会显示一个乱码,并且每句都是同一个乱码。
- 获得
'title'
和'artist'
信息后,切割时需留下'
符合,否则中文信息会乱码。留下'
后中文可正常显示并前后带上'
字符,但是这样英文信息又无法获得,因为在遇到第一个'
字符时就退出了。
收获
- c语言
- 熟悉了结构体以及结构体指针的使用;
- gtk+
- 熟悉了glade的使用;
- 熟悉了gtk+与glade结合使用的方法;
- 熟悉了gtk+中各控件属性设置的方法;
- 熟悉了gtk+各控件回调函数的使用;
- 熟悉了gtk+多线程互斥的用法:
gdk_threads_enter();//进入多线程互斥区域
.....//需要调用gtk资源的代码
gdk_threads_leave();//离开多线程互斥区域
- 进程
- 熟悉了进程的创建,及使用exec替换进程
- 在子进程中使用
prctl(PR_SET_PDEATHSIG, SIGHUP);
调用可以实现在主进程退出时子进程收到消息也退出;
- 无名管道&命令管道
- 熟悉了无名管道的创建与读写;
- 熟悉了命令管道的创建与读写;
- 熟悉了dup复制文件描述符实现重定向;
- 线程
- 熟悉了线程的创建及使用;
- 多任务的互斥与同步
- 熟悉了mutex互斥锁的使用;
- 熟悉了sem信号量实现多任务的同步;
- 了解了mutex和sem的区别与联系:
mutex锁住某种资源,使得该资源一次只能被一个对象访问,实现资源的互斥;而sem是发送信号表示接下来可以干什么,本质上是用来实现同步。
例如:a: 饮水机{ pthread_mutex_lock(); 倒水; pthread_mutex_unlock(); } b: 倒水{ sem_wait(&s1); 倒水; sem_post(&s1); } c: 倒水{ 倒水; sem_post(&s2); } 喝水{ sem_wait(&s2); 喝水; }
其中a的意思是指饮水机一次只能有一个人倒水,需要等待倒水结束了下一个人才能来倒水;b的意思是倒水结束后便通知自己(s1)可进行下一次倒水了;c的意思是倒水结束后便通知s2可以开始喝水了。虽然b方法实现的效果与a相同,但不推荐。
这次作业超时较长,收获很大。从一开始的一头雾水不知道从哪里开始,到后来对项目的结构越来越清晰,对各个功能需要用到哪些知识如何实现都有了基本的了解。总共历时十天,如果减去刚开始的软件系统版本兼容问题折腾了两天以及中间干了些其他事花了一天,其实也还好,毕竟全程靠自己摸索。
最近做这个项目都做得上瘾了,原来一直早起难的问题也解决了。现在早上一醒来就想起床早点把昨晚躺床上想到的好点子验证实现一下,希望能保持这个状态。
网友评论