OMThread 是框架基本活动类。其职责如下所示:
这个类是在头文件 omthread.h 中定义的。
OMThread 是每个处于活动状态的类的基类。活动类的对象:
因此,每个活动对象都有一个 OMThread 实例,该实例由以下两部分内容组成:
在缺省情况下,应用程序中至少有两个线程:计时器线程和主线程。在这种简单情况下,所有事件都在主线程事件队列中排队。
每个操作系统都具有不同的本机线程实现。
线程负责向所有在其中运行的实例提供事件服务。每个分配给对象的事件都将发送到它的相关线程。线程在事件队列中存储事件。OMThread 使用 while 循环来使用出现在队列开头的事件。
活动对象还可以为非活动对象提供服务。例如,应用程序可能有一个类 a,这个类具有状态图但仍处于活动状态,因此它继承 OMThread 和 OMReactive。应用程序可能还有一个类 p,这个类具有状态图,但未处于活动状态。类 p 继承 OMReactive。
假定 p 正在 a 的线程下运行。每个以 p 为目标的事件都必须存储在某个位置,并且 p 没有事件队列。因此,p 将以其为目标的事件委派到 a 的事件队列,这是因为 p 在 a 的操作系统线程中运行,并且 a 有事件队列。
如果存在以下代码行(用于生成以类 p 为目标的事件 e),那么 e 将存储在 a 的 OMThread 事件队列中:
p -> GEN(e)
在 OMThread 中,execute 方法通过对事件队列执行循环来查找更多事件。当它找到一个或多个事件时,将从事件队列中弹出第一个事件(例如 e)。此事件具有一个用于指定目标(在本例中,这是 p)的字段。然后,通知 p 对事件 e 作出反应。不必立即使用此事件 - 此事件将在事件队列中等待。是时候使用此事件时,将使用 takeEvent 方法从事件队列中弹出此事件并将其注入到 p 的 OMReactive 中。
在 V4.0 中,对 OMProtected 的继承已替换为聚集。因此,对 OMThread 接口添加了以下内容:
aomthread
这个受保护属性指定线程的“受检测”部分。
其定义如下所示:
AOMThread *aomthread;
AOMThread 类是在受检测应用程序中的动画框架中定义的,并且,在不受检测方式下设置为空类。
endOfProcess
这个公用属性指定应用程序是否处于进程末尾。如果是,那么必须“清除”该进程中的最后一个线程。
此标志可能的值如下所示:
其定义如下所示:
static int endOfProcess;
eventQueue
这个受保护属性指定线程的事件队列。
其定义如下所示:
OMEventQueue *eventQueue;
类 OMEventQueue 是在 os.h 中定义的。
thread
这个受保护属性指定线程的“操作系统”部分。
其定义如下所示:
OMOSThread *thread;
OMOSThread 类是在 os.h 中定义的。
toGuardThread
这个受保护属性确定线程代码的某个部分是否将受保护。如果此属性设置为 TRUE,那么该代码受保护。否则,该代码不受保护。
其定义如下所示:
OMBoolean toGuardThread;
OMBoolean 是在 rawtypes.h 中定义的。
toGuardThread 由 execute 方法在开始执行其事件循环迭代之前检查。如果 toGuardThread 为 TRUE,那么 execute 将调用 OMGuard 类 和 OMGuard 类 宏。