例外情况是工作线程被激活之前或完成之后,UI代码可以与Worker对象交互。在工作线程启动前,UI代码能建立和初始化Worker对象;在工作线程被终止后,UI可以从Worker对象检索到任意值。下面是UI角度的的事件流程:
1、建立Worker对象。
2、初始化Worker对象。
3、调用控制器启动工作线程。
a.Worker对象能通过控制器向UI发送状态信息。
b.UI能通过控制器向Worker对象发送“取消”请求。
4、当Worker对象结束后它通过控制器通知UI。
5、值可以直接从Worker对象检索到。
除了工作线程活动时,UI代码不能直接与Worker对象交互外,对UI来说没有特殊的代码需求。当后台处理在运行时UI保持活动并响应用户。
Worker对象角度的事件流程如下:
1、UI代码创建Worker对象。
2、UI代码使用需要的值来初始化Worker对象。
3、控制器创建后台线程并调用Worker对象的方法。
a. Worker对象运行工作代码。
b. 对象将任何状态信息传递给控制器,这样控制器才能将信息传递给UI。
c. 适当时,Worker对象查看是否有“取消”请求,如果有,就停止。
d. 当Worker对象完成后,它告诉控制器工作已经结束,这样控制器可以将该信息传递给UI。
4、现在工作线程终止,UI能直接与Worker对象交互。
由于工作代码只与控制器交互,我们不用担心工作线程突然与UI组件交互,而这种偶然的交互可能影响应用程序。另外,工作代码依赖于控制器才能与UI线程正确地通信,因此它们都是安全的。
这意味着我们在工作代码中不需要处理任何线程的问题,而只需要处理Worker对象的实例变量。
考虑不同组件,特别是在不同线程上的不同组件之间的交互通常最好使用图。Microsoft? Visio?支持建立UML(通用建模语言)图,它对我们非常有帮助。
下面是阐明UI、Worker对象和Controller之间事件流程的UML序列图。该图假定没有“取消”请求。所有的代码在UI线程上运行。
图2:过程流序列图
了解相同信息的另一种方法是使用UML行为图。这一类图更注重事务而不是对象,因此它显示了事务发生的步骤和过程是怎样一步一步地进行的。我们可以轻易地看出UI代码在左边的线程中工作,而Worker对象在右边的另一个线程中工作。Worker对象在另一个线程中运行之前和之后,它可以被UI直接地使用,进行初始化,然后检索结果。
图3:显示过程流的行为图
使用这类图能帮我们查明后台线程活动时UI与工作线程偶然交互的地方。任何偶然的交互都需要额外的代码来避免bug影响应用程序的稳定性。理想的情况是,这样的交互通过Controller组件发送,在那儿(Controller中)包含使这种交互安全的所有代码。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页