QWorker的作业类型详解

   QWorker最近很受群友的关注,因此单独将其中的作业类型详细拿出来说明下。

   QWorker的按照不同的标准,可将作业类型分为不同的类型:

   1、按触发方式分

   按照触发方式可以分为手工投寄、定时重复和信号触发三种方式。顾名思义,手工投寄作业用户投寄一次就只运行一次,如果需要,就由用户手工重复投寄。而定时重复作业,会按指定的时间间隔,由系统自动调度执行。而信号触发作业等待特定的信号发生,然后在信号发生时,自动投寄作业进行执行。

   对于手工投寄的作业,直接调用Post函数,定时重复作业重载了Post函数,并加入了一个Interval来代表重复时间间隔。信号触发类型的作业步骤稍显多一些:

   首先,信号要先注册,调用Workers.RegisterSignal来注册一个信号,然后会返回一个用来唯一标记这个名称信号的ID。

   第二步,调用Workers.Wait函数告诉QWorker自己要等待的信号名称或ID,推荐用ID,开销更小一点点,但用信号当然也可以,只不过触发时,需要先遍历所有信号找到相应的信号ID,然后执行触发过程。

   第三步,在需要执行相关操作时,调用Workers.Signal函数触发信号,同样推荐使用ID。在第二步触发的信号响应作业,会自动被触发,至此完整的信号触发过程完成。

   2、按执行时间点分

   按照执行时间点分,作业分为立即执行和定点执行两种。立即执行的作业在用户投寄后,如果有空闲的工作者就立即执行,而定点执行的作业,则需要在规定的时间点进行执行,这个时间点可能是从当前时间延迟一段时间来计算,也可以规定一个具体的时间点,作业在该时间点被调度执行。

   投寄立即执行的作业,仍然是使用Post的最简单形式,对于定点执行的,有Delay和At两个函数。顾名思义,Delay是延迟一段时间执行一次,而At是在指定的时间点执行,但允许指定一个首次运行延迟和后续运行周期(Interval)。

   3、按执行时长区分

   按照执行时长区分为长时间作业和短时间作业两种。当然这只是一个逻辑上的区分,你可以将长时间作业当成短时间作业来投寄,但是,为了逻辑上更明确,还是建议使用LongtimeJob来投寄长时间作业,而且系统会长时间作业进行限制了其工作者数量,以防止占用过多的处理资源,以提示你编码时注意不要滥投寄长时间作业。

   4、按执行线程区分

   按照执行线程区分作业可以分为主线程作业和后台线程作业。主线程作业运行在主线程中,可以安全的访问窗体上的内容,一般用于更新进度及提示什么的,而后台线程作业一般执行实际的数据处理操作,以避免占用主线程资源,造成程序假死的现象发生。

   要投寄一个到主线程中执行的作业,只需要简单的将ARunInMainThread参数设置为True即可。

分享到: