将播放的核心封装为CMedia后,剩下的事情便是逻辑层了。对于写过UI程序,并且之前还做了点小程序的段伏枥来说,这并不是什么很难的事情。唯一的难点在于,播放的时候该如何显示滚动条以及时间。其实CMedia封装了获取当前时间的接口,当然也有获取整个长度的,根据两者的比例可以算出来滑动块的位置。至于时间的显示,只要转换一下,也根本不在话下。只是如何应该在哪里获取呢?主线程肯定是不行的,因为它只能被消息循环占据。所以,唯一的选择只能是多线程,而这便是段伏枥多线程旅程的开始。
如何开始多线程,也是有章可循,在《Windows CE程序设计》就有相关的章节,只需要调用相应的函数即可。是不是非常简单?段伏枥也是这么想的。不就是在线程函数中获取时间,并做显示吗?有什么难度啊?相较之以前的菜鸟阶段,段伏枥整这音乐播放器的逻辑层速度也就快多了,一个星期左右,就将整个程序给完成了。看着自己亲手完成的音乐播放器,虽然比不上千千静听啊之类,但也让自己兴奋了好一阵。可在实际的测试中,段伏枥却发现了个致命的问题:在切换下一曲的时候,偶尔会崩溃!
怎么回事,段伏枥这下可头大了。仔细查看了下代码,也找不出蛛丝马迹。索性将刷新线程给屏蔽掉吧!没想到,这么一来,一切正常!原来问题是出在多线程上!可这线程会有什么问题呢?咋看都不像有病的样子。段伏枥为此而苦恼了好几天。万事总有其原因乃至解决之道,有一天段伏枥不经意间看到一篇帖子,提到多线程可能会有资源占用的问题。不过这文章全是英文的,自己也没有仔仔细细全部看完,但毕竟给予了灵感。而顺着这灵光一闪,段伏枥找到了问题关键所在:在停止播放到开始播放另一个文件的这个间隔中,如果继续获取当前时间,那么程序将会崩溃!因为那时候实例已经释放,直接是使用空指针来提领,能不出错吗?
找到问题的根源所在,似乎解决问题的方法也不难:不就是因为不知道当前的播放状态而导致的吗?自己增添一个变量,分别标示播放完毕以及播放开始,然后在线程中进行判断,这不就好了嘛?不能不说,这是一个非常正确的解决方式,但却并不彻底。崩溃的几率减少了,但却没有完全杜绝,偶尔的偶尔还是会崩溃。这究竟是怎么回事呢?不是已经设置标志了吗?为什么还会这样呢?这问题肯定还是因为多线程,可是根源在哪里?
不得已,段伏枥只好硬着头皮将那篇英文文章看完。噢,原来如此!问题很可能在于,子线程在判断状态之后,然后开始获取当前时间的这个间隔呢,可能主线程已经将当前的实例给释放了!为了避免这情况的发生,只需要加上临界区即可。这么简单的问题,却让自己想了那么多天;而更为让自己汗颜的是,这种可能性在文章中已经明明白白写了出来,仅仅是因为自己的懒惰以及怕麻烦,只是匆匆看一眼,才引发了后续时间的浪费。果然,做技术的,没有那么多模棱两可,浅尝辄止永远只能有数不尽的麻烦。
当将临界区这一利器添加到代码之后,段伏枥长长地舒了一口气:程序再也不见崩溃了。
相对于段伏枥来说,沈俊就比较凄凉了。对于之前只接受过所谓的高等教育的大学生来说,普遍的动手能力和专业知识水平如何,想必地球人都知道。而沈俊偏偏也不是个例外,也是这普遍中的一员,也就是说,对于硬件设计,她也是一窍不通。只不过,对于软件来说,只要你选择了一个方向,那么很容易就能找到相关的入门资料,即使是入门的书籍也是片地开花。可是对于硬件呢?那就没那么幸运了?有谁见过手把手教的入门书籍的?公司里面唯一和硬件有点沾上边的,只有黄华中,想他给沈俊讲课?那是做梦!估计即使真想讲,也说不出个所以然来,毕竟水平在那摆着。黄华中所做的,便只是将机器的原理图扔给沈俊,然后丢下一句话:“你自己看看原理图,用心点,好好学学!”
毫无经验的沈俊看着这原理图,连哭的心都有了:这些是什么啊?为什么要这么连接啊?而这大大的一颗芯片,究竟是做什么用的?段伏枥唯一能帮的,便是告诉她,可以在www.alldatasheet.com网站中能够查到相应的IC资料,除此以外,也爱莫能助。不过即使这么一小点,也足以让沈俊感激涕零,毕竟可以不用那么盲目了。
黄华中交给沈俊的任务是,第二版回来了,有一些元器件没有焊上去,将它们给补上。段伏枥看着这贴片的元器件,心中不由发颤。想当年大学的时候,有一个设计就是焊接收音机。原理图,板子,元器件,什么都有,并且这元器件还是插件式的。如果仅仅以一般的焊接工的水平来看,焊接这些东西根本就是小儿科;可对于段伏枥来说,这可真不是一件省心的火,特别是怎么焊都无法上锡。一个不合格的焊接,能期望有什么良好的结果?所以,那收音机从来就没响过,连点沙沙的噪音都没有!所幸这门课的考核非常轻松,只要你拿着一台焊好的收音机,能收到节目,递给老师听就可以过关了。而这检查,也不是像考试那般需要大家一起进行,而是一个时间点,大家轮流进行。所以最后段伏枥便借了同学焊接好的一台收音机,蒙混过关。而对于借给自己收音机的同学,连饭也不用请,因为不仅是段伏枥,别的同学也是这么做的。甚至可以这么说,整个专业,大概一百来号人,而做出好的收音机不到十台。换句话来说,大家都是借着这不到十台的好收音机,互相轮流过关的。噢,My God,这便是所谓的天之骄子的残酷真实……
虽然沈俊的硬件原理水平是一片空白,但在焊接方面还是过得去的。至少和段伏枥相比,已经是天壤之别了:沈俊能够焊接贴片器件,并且还能正常工作;而自己整的插件式,却是哑炮。
沈俊来了没多久,便要回学校了,理由很简单也非常充分:毕业答辩。只不过,本来预计是两周之后回来的,但到了期限沈俊还是没有回来。怎么回事呢?吃饭的时候,段伏枥问了问黄华中,才知道事情的原委:毕业答辩没通过。
毕业答辩通不过?这也太离谱了吧?虽然每个专业都是有指定的指标,规定这次要有多少人不通过的,但这些指标一般是落在那些经常逃课之类的黑五类啊!沈俊再怎么看,都不像这样的人。
好奇,打个电话问问:“沈俊,怎么回事?毕业答辩没通过?”
虽然仅仅是在电话中,也能听出沈俊愤怒了:“别提了!我们那导师,在答辩前两天,说我的这个课题太空泛了,不能作为答辩的题目,让我重新选题!哎,这课题是他出的让我选的啊!还有两天,居然跟我说这课题不行!要是真不行,干嘛不早说!只有两天,你能让我怎么办?”
“后来呢?”
“有什么办法,我就只好重新选新的课题咯,这两天通宵整论文,最后还是没过。现在只能等一周后的重新答辩了”
听到这里,段伏枥明白了,因为之前他的一个高中同学也遇到过类似的事情,于是对沈俊说道:“噢,原来是这样。我知道你为什么不过了,其实如果你做点事,那么重新答辩你一样不过。”
关系到切身利益,没有谁不心焦,沈俊急忙问道:“你说嘛!到底怎么回事,别卖关子了!我现在急死了!”
听着沈俊这焦虑的声音,段伏枥继续问道:“你没有给老师送礼吧?”
沈俊很奇怪地问道:“没有啊,这个有关系吗?”
“你这傻妞!难道你没听出来吗?答辩前两天说题目不合格,这可能吗?摆明是暗示你,让你送礼啊!你想啊,作为导师,题目可不可以还不是他说了算?何况这题目还是他自己出的,说不合格那不是自己打自己嘴巴吧吗?他要的,是要你送礼!你不送,他肯定不会让你过!”
沈俊吃惊得哦了一声,但还是有点不太相信地说到:“他不会这么恶心吧?毕竟人家是大学教授啊!”
“哼,在中国,最恶心的就是这些叫兽和砖家,你看他们抛出来的论调,有哪些能获得大家的认可的?并且他们这些叫兽,如果评不上级别,看着别人的油水哗啦哗啦的,他们不眼红啊?他们也要拿好处的啊。那么这羊毛要出在哪里?那肯定就是在学生的身上!”
这时候,沈俊已经有半分相信:“那怎么办?我要送点什么?”
“买点酒哦,还有一条好点的烟,最好还包上个红包,应该也就差不多了……”
“哦,那好吧。不用再送什么了吧……”
“一般来说,应该差不多了。如果这叫兽死性不改的话,也许还需要潜规则一下……”
沈俊疑惑了:“什么潜规则……”
“就是演艺圈为了争到演女主角的那个潜规则啦……”
沈俊在电话一头大叫:“啊?我不会为了这毕业证,还要献身吧?”
段伏枥无奈地说:“我不知道你那导师的品性,最多我在深圳的仙湖公园帮你拜拜佛,让他将你那导师变成阳痿吧……”
“你……”
最后,沈俊还是按照段伏枥的建议,买了两瓶酒和一条烟,当然还包了个红包,送到导师家。据说那导师一开始还假惺惺说不能收礼物,但最后还是很高兴地拿走了,并且在第二天就给沈俊电话,说让她放心去答辩,一切包在他身上。结果自然是美好的,沈俊站在答辩台,念了一下论文的前言,就被告知答辩通过。虽然沈俊最后是花了不少钱,但所幸没有被潜规则,也算是不幸中之大幸。但至于为何没有被潜规则,是因为导师根本就没此打算呢,还是说段伏枥的拜佛起了作用,那也无从考究了……
- 前言
- 《那些年啊,那些事——一个程序员的奋斗史》——01
- 《那些年啊,那些事——一个程序员的奋斗史》——02
- 《那些年啊,那些事——一个程序员的奋斗史》——03
- 《那些年啊,那些事——一个程序员的奋斗史》——04
- 《那些年啊,那些事——一个程序员的奋斗史》——05
- 《那些年啊,那些事——一个程序员的奋斗史》——06
- 《那些年啊,那些事——一个程序员的奋斗史》——07
- 《那些年啊,那些事——一个程序员的奋斗史》——08
- 《那些年啊,那些事——一个程序员的奋斗史》——09
- 《那些年啊,那些事——一个程序员的奋斗史》——10
- 《那些年啊,那些事——一个程序员的奋斗史》——11
- 《那些年啊,那些事——一个程序员的奋斗史》——12
- 《那些年啊,那些事——一个程序员的奋斗史》——13
- 《那些年啊,那些事——一个程序员的奋斗史》——14
- 《那些年啊,那些事——一个程序员的奋斗史》——15
- 《那些年啊,那些事——一个程序员的奋斗史》——16
- 《那些年啊,那些事——一个程序员的奋斗史》——17
- 《那些年啊,那些事——一个程序员的奋斗史》——18
- 《那些年啊,那些事——一个程序员的奋斗史》——19
- 《那些年啊,那些事——一个程序员的奋斗史》——20
- 《那些年啊,那些事——一个程序员的奋斗史》——21
- 《那些年啊,那些事——一个程序员的奋斗史》——22
- 《那些年啊,那些事——一个程序员的奋斗史》——23
- 《那些年啊,那些事——一个程序员的奋斗史》——24
- 《那些年啊,那些事——一个程序员的奋斗史》——25
- 《那些年啊,那些事——一个程序员的奋斗史》——26
- 《那些年啊,那些事——一个程序员的奋斗史》——27
- 《那些年啊,那些事——一个程序员的奋斗史》——28
- 《那些年啊,那些事——一个程序员的奋斗史》——29
- 《那些年啊,那些事——一个程序员的奋斗史》——30
- 《那些年啊,那些事——一个程序员的奋斗史》——31
- 《那些年啊,那些事——一个程序员的奋斗史》——32
- 《那些年啊,那些事——一个程序员的奋斗史》——33
- 《那些年啊,那些事——一个程序员的奋斗史》——34
- 《那些年啊,那些事——一个程序员的奋斗史》——35
- 《那些年啊,那些事——一个程序员的奋斗史》——36
- 《那些年啊,那些事——一个程序员的奋斗史》——37
- 《那些年啊,那些事——一个程序员的奋斗史》——38
- 《那些年啊,那些事——一个程序员的奋斗史》——39
- 《那些年啊,那些事——一个程序员的奋斗史》——40
- 《那些年啊,那些事——一个程序员的奋斗史》——41
- 《那些年啊,那些事——一个程序员的奋斗史》——42
- 《那些年啊,那些事——一个程序员的奋斗史》——43
- 《那些年啊,那些事——一个程序员的奋斗史》——44
- 《那些年啊,那些事——一个程序员的奋斗史》——45
- 《那些年啊,那些事——一个程序员的奋斗史》——46
- 《那些年啊,那些事——一个程序员的奋斗史》——47
- 《那些年啊,那些事——一个程序员的奋斗史》——48
- 《那些年啊,那些事——一个程序员的奋斗史》——49
- 《那些年啊,那些事——一个程序员的奋斗史》——50
- 《那些年啊,那些事——一个程序员的奋斗史》——51
- 《那些年啊,那些事——一个程序员的奋斗史》——52
- 《那些年啊,那些事——一个程序员的奋斗史》——53
- 《那些年啊,那些事——一个程序员的奋斗史》——54
- 《那些年啊,那些事——一个程序员的奋斗史》——55
- 《那些年啊,那些事——一个程序员的奋斗史》——56
- 《那些年啊,那些事——一个程序员的奋斗史》——57
- 《那些年啊,那些事——一个程序员的奋斗史》——58
- 《那些年啊,那些事——一个程序员的奋斗史》——59
- 《那些年啊,那些事——一个程序员的奋斗史》——60
- 《那些年啊,那些事——一个程序员的奋斗史》——61
- 《那些年啊,那些事——一个程序员的奋斗史》——62
- 《那些年啊,那些事——一个程序员的奋斗史》——63
- 《那些年啊,那些事——一个程序员的奋斗史》——64
- 《那些年啊,那些事——一个程序员的奋斗史》——65
- 《那些年啊,那些事——一个程序员的奋斗史》——66
- 《那些年啊,那些事——一个程序员的奋斗史》——67
- 《那些年啊,那些事——一个程序员的奋斗史》——68
- 《那些年啊,那些事——一个程序员的奋斗史》——69
- 《那些年啊,那些事——一个程序员的奋斗史》——70
- 《那些年啊,那些事——一个程序员的奋斗史》——71
- 《那些年啊,那些事——一个程序员的奋斗史》——72
- 《那些年啊,那些事——一个程序员的奋斗史》——73
- 《那些年啊,那些事——一个程序员的奋斗史》——74
- 《那些年啊,那些事——一个程序员的奋斗史》——75
- 《那些年啊,那些事——一个程序员的奋斗史》——76
- 《那些年啊,那些事——一个程序员的奋斗史》——77
- 《那些年啊,那些事——一个程序员的奋斗史》——78
- 《那些年啊,那些事——一个程序员的奋斗史》——79
- 《那些年啊,那些事——一个程序员的奋斗史》——80
- 《那些年啊,那些事——一个程序员的奋斗史》——81
- 《那些年啊,那些事——一个程序员的奋斗史》——82
- 《那些年啊,那些事——一个程序员的奋斗史》——83
- 《那些年啊,那些事——一个程序员的奋斗史》——84
- 《那些年啊,那些事——一个程序员的奋斗史》——85
- 《那些年啊,那些事——一个程序员的奋斗史》——86
- 《那些年啊,那些事——一个程序员的奋斗史》——87
- 《那些年啊,那些事——一个程序员的奋斗史》——88
- 《那些年啊,那些事——一个程序员的奋斗史》——89
- 《那些年啊,那些事——一个程序员的奋斗史》——90
- 《那些年啊,那些事——一个程序员的奋斗史》——91
- 《那些年啊,那些事——一个程序员的奋斗史》——92
- 《那些年啊,那些事——一个程序员的奋斗史》——93
- 《那些年啊,那些事——一个程序员的奋斗史》——94
- 《那些年啊,那些事——一个程序员的奋斗史》——95
- 《那些年啊,那些事——一个程序员的奋斗史》——96
- 《那些年啊,那些事——一个程序员的奋斗史》——97
- 《那些年啊,那些事——一个程序员的奋斗史》——98
- 《那些年啊,那些事——一个程序员的奋斗史》——99
- 《那些年啊,那些事——一个程序员的奋斗史》——100
- 《那些年啊,那些事——一个程序员的奋斗史》——101
- 《那些年啊,那些事——一个程序员的奋斗史》——102
- 《那些年啊,那些事——一个程序员的奋斗史》——103
- 《那些年啊,那些事——一个程序员的奋斗史》——104
- 《那些年啊,那些事——一个程序员的奋斗史》——105
- 《那些年啊,那些事——一个程序员的奋斗史》——106
- 《那些年啊,那些事——一个程序员的奋斗史》——107
- 《那些年啊,那些事——一个程序员的奋斗史》——108
- 《那些年啊,那些事——一个程序员的奋斗史》——109
- 《那些年啊,那些事——一个程序员的奋斗史》——110
- 《那些年啊,那些事——一个程序员的奋斗史》——111
- 《那些年啊,那些事——一个程序员的奋斗史》——112
- 《那些年啊,那些事——一个程序员的奋斗史》——113
- 《那些年啊,那些事——一个程序员的奋斗史》——114
- 《那些年啊,那些事——一个程序员的奋斗史》——115
- 《那些年啊,那些事——一个程序员的奋斗史》——116
- 《那些年啊,那些事——一个程序员的奋斗史》——117
- 《那些年啊,那些事——一个程序员的奋斗史》——118
- 《那些年啊,那些事——一个程序员的奋斗史》——119
- 《那些年啊,那些事——一个程序员的奋斗史》——120
- 《那些年啊,那些事——一个程序员的奋斗史》——121
- 《那些年啊,那些事——一个程序员的奋斗史》——122
- 《那些年啊,那些事——一个程序员的奋斗史》——123
- 《那些年啊,那些事——一个程序员的奋斗史》——124
- 《那些年啊,那些事——一个程序员的奋斗史》——125
- 《那些年啊,那些事——一个程序员的奋斗史》——126
- 《那些年啊,那些事——一个程序员的奋斗史》——127
- 《那些年啊,那些事——一个程序员的奋斗史》——128 (终章)