改进关闭程序的机制,为之后储存数据铺路2018-12-06

1、今天查了下ManualResetEvent类的用法,他是可以在一个线程控制另一个的信使,

那样就可以用WaitOne,Set,Reset组合出某个线程在某个设定好的语句中进行阻塞,实现线程同步:

改进关闭程序的机制,为之后储存数据铺路2018-12-06_第1张图片
图1

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

改进关闭程序的机制,为之后储存数据铺路2018-12-06_第2张图片
图2

2、另外,似乎windows窗体程序都需要一个主窗口,然而为了更好的管理窗口,和优化程序速度,

我把每个窗口都用各自的线程运行,一个窗口一个线程:(主函数)

改进关闭程序的机制,为之后储存数据铺路2018-12-06_第3张图片
图3

但是这就涉及到了跨线程通讯问题,例如我要关闭一个窗口后其他窗口都关闭,

就需要在一个线程调用另一个线程的方法,

微软是禁止这样做的,然而这行代码:

Control.CheckForIllegalCrossThreadCalls = false;

可以忽略警告,但是存在即合理,CheckForIllegalCrossThreadCalls 这个属性的定义,它是一个static的,一旦修改,全局起作用。如果项目中其他人修改了这个属性,那么方案就失败了,要采取另外的方案;

所以我用了委托:

图4

两个窗口互相把关闭窗口的函数委托给对方,就可以做到关闭一个窗口后其他窗口都关闭的操作;

但是又有一个问题,相互调用的本质就是无限递归了,如何退出递归,很简单,让这个函数只运行一次:

改进关闭程序的机制,为之后储存数据铺路2018-12-06_第4张图片
图5

创建一个私有变量来记录;

当窗口状态为false的时候,关闭其他窗口的函数便不再运行;

上一篇日记:增加了一个删除功能和修复了一个bug2018-12-05

下一篇日记:准备更多2018-12-09

你可能感兴趣的:(改进关闭程序的机制,为之后储存数据铺路2018-12-06)