改进关闭程序的机制,为之后储存数据铺路2018-12-06
2018-12-07 本文已影响0人
FDuiv
1、今天查了下ManualResetEvent类的用法,他是可以在一个线程控制另一个的信使,
那样就可以用WaitOne,Set,Reset组合出某个线程在某个设定好的语句中进行阻塞,实现线程同步:

因此关闭程序的时候,所有线程阻塞完毕后,可以进行存储数据操作:

2、另外,似乎windows窗体程序都需要一个主窗口,然而为了更好的管理窗口,和优化程序速度,
我把每个窗口都用各自的线程运行,一个窗口一个线程:(主函数)

但是这就涉及到了跨线程通讯问题,例如我要关闭一个窗口后其他窗口都关闭,
就需要在一个线程调用另一个线程的方法,
微软是禁止这样做的,然而这行代码:
Control.CheckForIllegalCrossThreadCalls = false;
可以忽略警告,但是存在即合理,CheckForIllegalCrossThreadCalls 这个属性的定义,它是一个static的,一旦修改,全局起作用。如果项目中其他人修改了这个属性,那么方案就失败了,要采取另外的方案;
所以我用了委托:

两个窗口互相把关闭窗口的函数委托给对方,就可以做到关闭一个窗口后其他窗口都关闭的操作;
但是又有一个问题,相互调用的本质就是无限递归了,如何退出递归,很简单,让这个函数只运行一次:

创建一个私有变量来记录;
当窗口状态为false的时候,关闭其他窗口的函数便不再运行;
上一篇日记:增加了一个删除功能和修复了一个bug2018-12-05
下一篇日记:准备更多2018-12-09