QWorker中TQJobGroup的Run和WaitFor/MsgWaitFor中超时的区别

今天群里,恢弘问起这个事,我想有必要跟大家解释一下。

首先,我们考虑TQJobGroup的生命周期,它创建后,我们有可能希望它后台运行,而不是需我们等待它其中的作业都执行完成,但又希望它不要运行太长时间。此时,我们就不能调用WaitFor或MsgWaitFor,而应该直接在Run里指定超时值,这样子,在所有作业都完成或者超时时,会自动触发AfterDone事件的执行,你可以在其中进行某些处理。

其次,WaitFor和MsgWaitFor的区别在于前者始终是阻塞执行的,后者则会检测当前调用线程是否是主线程,如果是主线程,则会启用消息循环而不是简单的阻塞代码执行。

也就是说,这么几条基本的约定:

1、如果希望TQJobGroup作业分组中的作业后台运行,那么应该设置AfterDone事件或者设置FreeAfterDone属性。调用者在AfterDone中做相应的处理,并适时决定是否释放TQJobGroup对象,而不要在TQJobGroup的Run后面直接释放TQJobGroup对象。

2、如果希望等待分组中作业完成,则应使用WaitFor或MsgWaitFor函数在Run之后等待超时。如果同时指定了Run和WaitFor的超时,则较短的那个生效。WaitFor和MsgWaitFor后,TQJobGroup可以安全的释放。

3、使用MsgWaitFor时,由于它会处理消息循环,因此,建议做适当的处理,以避免代码重入。

分享到: