最近,由于在 MFC 和C#项目中,都需要做很复杂的数据处理模块。一般耗时操作都需要封装到线程中去。由于模块很多,为每个模块编写“线程处理器”是一个繁重的工作。于是,我整理下通常模式下的需求,写个可以复用的线程处理模块,我称它——线程处理器。下面的
文章我用MFC来描述,类似的C#基类,我会把源码奉上。
好了,言归正传。我们看下面一个需求:
1 一个串口数据采集模块。
附带说一句,有的人把线程数据采集的线程驱动工作模块。这通常不会出什么问题。但如果碰到串口数据比较 多,而且工作模块耗时操作比较大。又或者是,多个串口同时采集。可能会造成串口数据无法及时取出,造成数据的丢失。所以,我觉得一个好的设计,是单独为线程设置一个采集线程。采集的数据添加到一个队列中。而工作模块也设计一个工作线程,然后再从队列中取出数据去处理。这样的模块划分才是正确的。
再回到串口数据的采集模块。需要一个线程不停采集数据。间隔时间,这个自己可以定。那么我们需要的是一个这样的模块:
间隔一定时间,去做一件事情。如果用户暂停,则等待。如果用户回复,则恢复工作。需要有可靠的启动和停止机制。一个工作者,间隔固
定时间去做一件事情。
我们再看另一个需求:
2 一个工作模块,等待用户发一个指令。然后再去处理数据。一个工作者,但只是在用户需要他工作时,才去工作。
3 由于MFC下的线程,同时也是一个消息的接收者,因此,必须考虑消息到来时,线程能处理消息。