9 —— 线程
吴博士又给董延明安排工作已经是半年后了,这半年董延明快变成杂役了。
吴博士让他写的是一个语音聊天程序,功能描述完全是口述,“董啊,你写个语音聊天程序,我要用?……什么功能,就是语音聊天啊。……你打开麦,说句hello,我这边听到了说句yeah,你也能听到,然后再说……还要什么设计思路呀?……就是你先写一个录音程序,然后存储起来,然后再用socket传送到对端,然后自动播放。……”
又是socket?董延明高兴了,会啥来啥。
他从吴博士那里拿走了一个麦,回到自己座位上赶紧打开《VC编程100例》,结果居然没有关于录音的程序。他猛地开始发毛了——从上次socket事件之后,这本书就被他当成了圣经,可是当羔羊迷途的时候发现圣经里面居然没有指明方向,这无异于大海航行看不见灯塔呀,能不发毛么。
他又打开《VC++技术内幕》找了许久,里面没有相关的例子,他意兴阑珊的打开《C++primer》,果不其然里面也没有,他随手扔掉这本破书,心里想着,“这两本破书里面一个有用的例子也没有,怎么还他妈的那么贵??对了,不知道书店里有没有编程1000例或者10000例来卖呢?”然后他又产生了一个很严肃的想法——编程这玩艺买本例子书照着编,只要会打字就能干呀,怎么还整的神叨叨的又要大学本科又要什么培训的?
董延明在google上输入“录音 程序”搜索,结果艘出来一个“基于API的录音机程序”的介绍网页。他也无心去研究API是什么东西了,只是照着代码输入了一串wavexxxx的函数,输入完后有编译错误他凭感觉修改了几个地方误打误撞居然让他编译通过了。他给自己录了一段音,然后播放了一下,居然成功了,顺利到他不敢相信。他记得socket似乎也有个什么API的,莫非所有跟API相关的东西都是要按照次序写好函数就能用了?他想到这里兴奋不已,想打开窗户大喊又想找人分享——他发现了一个惊天大秘密!
最终这个秘密没有跟人分享倒不是高手董小气,只是他实在说不清楚API是个什么东西。高手董把录音软件研究了一下,发现了一个问题,就是他这个软件只能录下来存到硬盘上,也就是说想要这边说那边听不可能,只有可能这边说完了然后用socket把文件传送过去,对方接收了文件同时播放才能听。
他把这个顾虑跟吴博士分享了一下,吴博士眼镜差点滑落到地上,“你没跟我开玩笑吧,这边说完了,一摁钮对方就能听到?这不成了电报机了么?我要即时通话,不要你这个什么什么电报机!!”
董延明灰溜溜的回座位,忙不迭的上网搜索。在试过录音和程序、录音和传送、录音和socket等关键词搜索之后,他终于想到了语音聊天源代码这个关键词,这才解决了电报机的尴尬。其实解决也很简单,就是一个buffer满了之后就触发传送的socket线程进行传送,对方就接收播放,连存储都省了。高手董对这个设计叹为观止,自己验证了几次,证明可以通畅对话就赶紧送给吴博士检查。
吴博士用了一下觉得还可以,发现还用了多线程便意外了一分钟,鉴于董延明的个人素质也实在不好提太多要求便勉强接受了。不过他又发现这个程序一运行CPU占用率便窜到100%,他问董延明这是怎么回事,董延明笑道:“是不是这台机器太慢了啊?”
吴博士白了他一眼,自己看了看代码,然后再接受和发送的两个线程里各增加了条语句sleep(1),问题便解决了。董延明又一次如同雷击般的兴奋,这就是实力啊,换腐朽为神奇点石成金的实力啊。随便加两个字母便能解决一个大问题,他又一次紧紧抓住椅子扶手来抑制住自己高呼“太神奇了”的冲动。
其实这个应用程序还有个小bug,不过因为这程序最终吴博士没有用上,所以这个bug也没有被发现,董延明觉得有点幸运。Bug是,程序运行一段时间就是弹出error的对话框,必须要重启程序才能继续使用,当时董延明想了无数方法都无法解决,其中包括一个异常经典的主意——就是让程序每隔1分钟自动重启一次。
董延明在一年后终于知道了为什么,就是缓存区的反复使用只有申请没有释放,与上一次的socket问题如出一辙。
董延明在两年后还知道了吴博士的sleep加的有些武断了,应该在传送完毕并且缓冲区未满的时候sleep,然后再在缓冲区转满后被触发醒来,每传送一次便sleep一次是会影响性能的。
上一篇 Java开源缓存框架介绍
下一篇 增资非解决之道 微软需寻求新并购对象
阅读推荐
相关文章