OSD Lyrics的一个最大的问题就是它的单进程单线程模型,这使得它在搜索和下载歌词的时候会阻塞正常的歌词显示,导致在下载未完成时切换歌曲会出现无响应的情况。
由于基础太弱,这个问题一直被我搁着,直到把APUE的前17章都看了一遍,对Unix系统下多进程/线程有了大概的了解,终于开始着手改造下载模块了。为了不影响主分支的开发,我在之前就已经创建了一个branch用于尝试异步下载的实现。
本着KISS的原则,第一个想法非常简单:
- 在准备下载时,fork出一个进程,父进程直接返回,子进程继续执行下载任务
- 子进程下载后直接中止进程
- 父进程在收到SIGCHLD信号后检查当前正在播放的音乐的歌词是否已被下载
这个想法,如果不涉及GUI,是可以很好地工作的,但是一旦要显示一个GUI让人选择要下载的歌词,就直接崩溃了。看来X相关的东西不能直接fork来多弄出一份,不过这也是很自然的。
看来之前建了一个branch是明智的,这个要折腾的时间确实比较长。
于是接下来似乎只有两条路可以走了:
- 用glib来创建一个线程,再想办法在搜索和下载成功时向主线程的消息循环插入一条消息
- 研究curl相关的异步下载方法
又要开始看文档鸟>_<

Oct 25, 2009 09:59:18 AM
不错啊,非常支持