去北京前后刚好一个月,去的时候紧急处理一个关于多线程的问题。结果回来后,麻烦一大堆!
本来这些个问题都不是我弄出来,我主要负责的方面也不是这个,但出于好奇和责任,还是管了管。
首先我把同事的几个疑惑说下:
1 本来4个线程运行一点问题都没有,为什么同事A不过加了一个写LOG的线程后,整个程序的界面都不会更新呢??然后他把这个线程去掉,就又可以啦,对于这个结果,他想不通。
最后的解决办法是:把后台线程中关于界面响应的都去掉了,好象运行是OK了。
2 新修改的同步程序中,碰到业务高峰期的时候,为什么同步不了啦??早上都还好好的,自己测试也是一点问题都没有,到了客户那里,一到最忙的时候,同步不行了。。。
对此,同事B想不通,测试很久,就是模拟不出来客户的现象,没办法,取消同步,走回原路。不过原路也不好走,程序运行个1、2天,就会死掉,但好歹还是能用,先将就吧。
3 这个多线程的程序为什么偶尔会出现想停止的停止不了?现象好象是随机的,但不可否认,的确存在。
以上问题,是典型的多线程问题,有的问题和现象还真的不好解释,也不好做调整。
为了解决这些问题,我找了不少资料,看了WINDOWS原理中关于进程和线程的调度和处理关系(我本专业是数学应用系)、又找了老版本的WINDOWS程序设计,终于对这些个
问题有了一知半解。
问题1 我个人认为是新加的LOG线程运行频率过高,本身运行的单次时间又很短。导致占用的CPU过高,排挤了同优先级别的界面更新线程。
问题2:因为后台线程的优先级别比同步线程的优先级别高不少,在业务的高峰期间,在WINDOWS的线程调度原则下,同步线程得不到CPU,导致同步失败。
问题3:多线程的东西为什么停止不了呢?因为在优先级别最高的线程加了3-5行控制界面的代码(DELPHI7下,是容许的),但调用时没有加上同步(SYS),这样就会引发不确定的问题。这个问题很严重,但在DELPHI的编译环境下是容许,并且通过实践来看,好象问题也不大,同样也能运行的好好的,只是偶尔会出现一些问题,但无论是系统先前的开发者还是后续的维护者,都没有深入的去看这个现象,全部将原因归结于操作系统、通讯等等意外情况。
要解决这样的问题,不是一天二天就OK的,而且有不小的难度。毕竟在这样的条件下,要兼顾:串口实时通讯、SQLSERVER,INI文件三大外部因素,其中一方出了问题,整个程序就会崩溃。有点让人难以下手,而且下手后的结果也不好估计,对于WINDOWS操作系统的了解,还不到家。我就象一个刚刚入了门的学生一样,好奇而又不知其全貌。
这半年来,我对WINDOWS的机制是越来越感兴趣的,这些远比现在一些新技术吸引我。我坚信如果我这一步不走稳走好,将来是走不远的。我的目标是做个WINDOWS CS结构程序的专家。希望后来者在走上开发这条路时,多打点基础!前段时间去用友,他们的开发框架我只用了2天就熟悉了。但这个WINDOWS机制却不是那么容易的!其实框架是个大结构,要理解起来是非常容易的,当然自己创立一个架构是不容易。
最后关于多线程,我想说的是,不要把所有的复杂的东西都写在一起,在面向对象的同时,参考下C模式下的分块、分层(不是C的专利),其实程序都很简单,复杂的东西也是由简单的代码复合而成。
如果将来有一天,大家看到复杂的代码后,有种举重若轻的感觉,而看到简单的代码后,有举轻若重的感觉话,那么恭喜你啦!
最后:第一次把随笔放在首页,希望后来者不要走我这样的弯路。我是工作了2年后才领悟到基础到底有多重要。