1 事件处理
ITK中的事件处理使用Subject/Observer设计模式来执行(有时涉及Command/Observer设计模式)。在这一方式中,对象通过注册它们正在观察的实例,来关注这个特定实例所调用的一个特定的事件。例如:ITK中的滤波器周期性地调用itk::ProgressEvent。当事件发生时对象已经记录下在这一事件中通报的信息。在记录过程中,通过调用一个命令来发出通告是特定的(例如:函数回收、方法调用等)(注意:ITK中的事件是EventObject的子类;查看itkEventObject.h可以得到确定的可能事件)。
例如:ITK中的许多对象在运行时将从ProcessObject调用特定事件:
this->InvokeEvent(ProgressEvent());
为了观察这一事件,注册需要结合事件Object::AddObserver()方法中的一个命令(例 如:回收函数):
unsignedlongprogressTag=
filter->AddObserver(ProgressEvent(),itk::Command*);
当事件发生时,所有注册观察者经过调用相应的Command::Execute()方式来通告。注
意到命令中的许多子类能支持如C类型函数的常数和非常数成员函数(查看
Common/Command.h得到Command的预定义子类。如果找不到合适的,可以选择
derivation)。
2 多线程
ITK中的多线程是通过一个高层次的设计抽象来处理的。这种方法提供了一个轻便的多线程,并隐藏了不同线程在ITK支持的许多系统中实现的复杂度。例如itk::MultiThreader类提供支持多线程在一个SGI中使用sproc()来运行,或者在任何支持POSIX线程平台上使用pthread_creat.
多线程通常是在它的运行阶段通过一个算法来使用的。多线程用来在多个线程中用单一的方法运行或经一个线程指定的方法运行。例如,在itk::ImageSource类(对大多数图像处理滤波器的一个超类)中,GenerateData()方式使用以下方法:
multiThreader->SetNumberOfThreads(int);
multiThreader->SetSingleMethod(ThreadFunctionType,void*data);
multiThreader->SingleMethodExecute();
在这个例子中,每个线程调用同一方法。多线程滤波器将图像分为许多部分,这些部分不能对写操作交叠。
在ITK基本原理中,线程安全是对一个类的不同实例(和它的方法)进行存储,它是一个安全线程操作。应避免在不同的线程中调用同一个实例方法。