2024年4月21日发(作者:)

ISSN 1009—3044 

E-maih xsjl@cccc.net.CB 

http://www.dnzs.net.CB 

Computer Knowledge and Technology电脑知识与技术 

Vo1.7,No.34,December 201 1. 

Tel:+86—551—5690963 5690964 

种基于Delphi的多任务调度模型 

尹海龙,夏洪山 

(南京航空航天大学民航学院,江苏南京210016) 

摘要:为了解决大量线程不断创建和销毁带来的开销问题,文章在Delphi开发平台下实现了一种多任务调度模型,并引入了死亡线 

程检测机制及时释放无用线程。实践表明,该模型具有良好的效率及灵活性。 

关键词:多任务;调度;Delphi;事件 

中图分类号:TP311 文献标识码:A 文章编号:1009—3044(2011)34—8884—02 

A Delphi-based Multi——task Scheduling Model 

YIN Hai—long,XIA Hong—shan 

(Co ̄ege ofCM1 Aviation,NaNing University ofAeronautics and Astronautics,Nanjing 210016,China) 

Abstract:In order tO solve the overhead problem brought by the creating and destroying of a large number of threads,the paper achieves a 

nmlti—task scheduhng model based on delphi development platform,and introduces the method tO release useless threads with dead thread 

detection.Practice shows that the model has good eficifency and flexibility. 

Key words:multi——task;schedule;delphi;event 

在多任务处理的相关应用中,经常需要用到多线程技术。多线程应用程序将程序划分为多个独立的任务,主要作用有以下几 

点:1)对于带有界面的应用程序,通过将密集计算模块放人后台工作线程,可以使程序界面一直处于活动状态,避免程序“假死”,改 

善用户体验。2)多个任务需要并行处理时,可以通过多线程技术轮流获得CPU时间。3)当多个任务重要程度不相同时,可以通过 

线程的优先级设定来优先满足重要任务的资源需要。 

虽然多线程技术有诸多优点,但是大量线程的创建、切换、销毁会额外占用不少宝贵的CPU资源。因此为了最大限度的减少线 

程的创建和销毁次数,笔者在Delphi开发环境下,运用Windows API和Object Pase',d编程语言设计了一种通用的、资源占用率较低的 

多任务调度模型。主要设计思路是将处理同一类任务的线程抽象成处理机类,另外设计一种调度类来负责任务的指派,处理机的 

管理。调度类的对象将根据用户预先设定的处理机数目创建并管理处理机对象,每个处理机处理完当前任务之后将排队等待调度 

对象分配后续任务。这样将最大限度的减少线程的创建和销毁的次数,增加有效任务的CPU时间,提高程序效率。 

1模型说明 

此多任务调度模型主要由三个部分组成,运用面向对象的思想将此三个对象抽象成为三个类,分别为调度类TScheduler、处理 

机类TAgent、任务类TMission。模型体系结构如图1所示。 

1。1调度类TScheduler 

调度类在整个系统中只能实例化一个对象,它可以指定并行任务的数目,然后生成相应数量的TAgent对象,并控制任务资源的 

合理分配以保持多个TAgent对象对资源竞争时的同步和互斥。如果某个TAgent获取任务后长期得不到CPU时间,会产生线程假死 

现象,本模型采用如下处理策略:如果某一TAgent对象对某一任务的处理时间超过了一个时间阈值,那么就强行中止该TAgent对象 

的运行,清空其处理结果,并将其正在处理的任务放回任务队列。TSched. 

uler类声明的主要逻辑代码如下: 

TScheduler=class(TComponent) 

private 

FMissionQueue:TList;//任务队列 

FAgentDeadTimeout:DWORD;//Agent超时阀值 

FAgentsList:TList;,,运行中的Agent队列 

FAgentsKilling:TList;//等待安全结束的Agent队列 

FAgentsNum:Integer;//OF行Agent的数量 

protected 

创 

清 

列 

FCurrentlndex:Integer;//记录任务队列的当前索引 

图1调度模型体系结构 

收稿日期:2011-09-15 

作者简介:尹海龙(1986一),男,山东潍坊人,在读硕士,研究方向为信息管理与网络通信;夏洪山,男,博士生导师,研究方向为智能 

运输系统建模、仿真与优化。 

8884 …软件设计开发 本栏目责任编辑:谢媛媛 

第7卷第31期(2011年11月) 

Computer Knowledge and chnD『0gy电脑知识与技术 

HMiSSionNumSemapho THandle;//统计任务数的信号量句柄 

HC1earTimer:THandle;/,定时器变量句柄,每隔一段时间清除一次死掉的Agent 

procedure ClearDeadAgents;//清除死掉的Agent 

procedure FrleeFinishedAgents;//幂 宜 FAgentsKillingylJ 中的Agent 

Drocedure GetMission(out Mission:TMission);//申请任务 

public 

constructor Create(AOwner:TComponent);//构造函数 

destructor Destroy;override;//析构函数 

function AddMissions(aMissi0nData:,/添加任务接1:3函数 

TMission):Boolean;overload; 

published 

Drope ̄y OnProcessMission://Agent处理任务时触发的事件 

TProcessMission read FProcessMission write FProcessMission;//Agent初始化时触发的事件 

property 0nAgentInitializing: 

TAgentlnitializing read FAgentInitializing write FAgentInitia1izing; 

Droperty OnAgentFinalizing://Agent结束时触发的事件 

TProcessorAgentFinalizing read 

FAgentFinalizing write FAgentFinalizing; 

Droperty AgentDeadTimeout:DWORD read FAgentDeadTimeout write//Agent超时阀值属性 

FAgentDeadTimeout defauh 0; 

property AgentsNum:Integer read FAgentsNum write FAgentsNum default】;∥并行Agent的数量属性 

end; 

本模型为了提高通用性引入了事件机制,事件表示某个动作的发生,诸如单击一个按钮、按下键盘上的一个键等。在模型中, 

通过引入事件机制可以灵活指定在某个动作发生时需要执行的操作。本模型共定义了三个事件:OnAgentInitializing、OnProcessMis. 

sion和0nAgentFinalizing,分别在Agent对象初始化时、得到任务进行处理时、结束所有任务时触发。现以OnProcessMission事件为 

例,详细介绍事件机制在本模型中的应用。事件句柄的类型为:TProcessMission=pmcedure(sender:TScheduler;Mission:TMission; 

Agent:TAgent)ofobject;事件句柄实际上就是一个函数指针,规定了函数的类型和返回值。此处通过事件句柄传递了三个信息:当 

前调度对象、当前任务对象和当前处理机对象。在Agent对象的Execute方法中触发此 

事件,就可以对指定的任务调用指定的算法模块。r■ —_、) 

1.2处理机类TAgent 1l 

TAgent类继承自Delphi封装的线程类1_rhread,TAgent类型的对象由TScheduler对 

象统一管理和调度,对外部对象来说是透明的。一个TAgent对象本质上是一个内核级 

迥 :竺:竺要兰 

+ 

的线程,是由操作系统感知和调度的。 

TAgent类的主要处理逻辑都在Execute方法中,此方法主要完成了排队申请任务,处 

理任务,状态反馈,通知TScheduler实例定时清理死线程的功能。其主要处理流程如图2。 

1.3任务类TMission 

. 

: 竺 

由于不同的应用场合的任务形式有所不同,因此在此模型中将TMission类定义为 

●V 

了抽象类,在具体应用时需要根据具体应用来继承扩展TMission类。 

2模型应用 

笔者在参与开发的飞机排班系统中对此模型进行了应用验证。飞机排班就是以机型 

为唯一的任务号,为每个机型的飞机安排每天的飞行任务。具体应用过程如下:1)将用 

n 痿倒黼窿H- 

{ 目酶《牧海 

MATLAB语言编写的飞机排班算法编译成DLL文件。2)实例化一个TScheduler对象,指定 

~ 

初始化参数,指定各个自定义事件的事件处理函数。3)在OnProcessMission事件中调用飞 

机排班算法DLL,算法根据得到的机型去数据库中取出相应数据,编排完成后将数据存人 

T^ l埔恻串鳓 既 

数据库。通过多个任务的并行编排,明显提高了飞机排班速度,达到了预期的运行效果。 

下^ 氍侧 

3总结 

离倒概 

本文提出了一种在Delphi开发环境下实现的线程调度模型,通过自定义事件的机 

堙黜】 

。 

制提高了该模型的通用性和灵活性,同时引入了死亡线程检测机制,避免了CPU资源 

的浪费。本模型在需要同时开启大量任务的场合具有一定的实用性。 

艘鹱铡商嬲髓湖 

参考文献: 

【1】罗字府临锋操作系统多线程实现技术研究[J]小型微型计算机系统,2000,21(5):500—503. 

趣搬 

【2】黄德才,钱能.多机相关任务均衡调度问题的复杂性与新算法[J】.计算机工程与科学, 

图2 TAgent类中Execute方法的 

2000,22(2):15-17. 

处理流程 

【3]肖刚.sMA一种新的多线程处理器模型【J].计算机工程与科学,1999,21(4):7—12. 

本栏目责任编辑:谢媛媛