用信号量实现实时多任务管理(二)

时间:2021-02-13 15:11:44

  

                                     HTTP实时下载模块设计

一、概述:
 此模块主要用于实现实时实习下载http任务。
 其中主要设计7个线程。分别为:主线程、分发线程和5个任务线程。
主线程(HttpProcess):
目的:通过MSW消息机制,从模块Mx接收http请求消息,并存储在一个大小受限的循环队列中。
返回值:返回模块Mx循环队列满状态,不能再接收消息。
分发线程(DistribProcess):
目的:从循环队列中读取消息,并分发给5个任务线程。
任务线程(TaskProcess,5个):
          目的:接收分发线程的任务,实现下载。
          返回值:返回模块Mx下载任务完成信息。
二、线程间关系:
设计7组信号量来激活不同想线程。分别为:
SemCycle,SemDistrib,SemWork0,SemWork1,SemWork2,SemWork3,SemWork4
 
SemCycle:
作用:记录循环队列中httpInfo的数目,每收到一个信息SemCycle+1,
初值:0,sleep,可供下载的信息,没有可用资源
最大值:队列的最长数目CycleMax
SemDistrib:
作用:记录空闲任务线程数目
初值:5,表示有可以使用的空闲任务线程数目是五个,表示有可用资源
最大值:5
SemWorki:
          作用:记录任务线程i 是否在空闲状态中
          初值:0,sleep,表示可以接收下载任务,有可用资源
最大值:1
          i = 0,1,2,3,4;
 
主线程:来自下载模块的httpInfo,
有 httpInfo 信息, SemCycle+1,if (SemCycle == CycleMax) ,返回循环队列满状态
分发线程:当SemDistrib>0 èSemWorki= 0,从循环队列中取出httpInfo,且SemCycle-1
          且 SemWorki+1èwake激活任务线程, SemDistrib-1
任务线程:完成下载任务,SemWorki-1èSleep挂起任务线程, SemDistrib +1
 
三、流程图:
   主线程(HttpProcess):

用信号量实现实时多任务管理(二)

分发线程(DistribProcess):

 用信号量实现实时多任务管理(二)

任务线程(TaskProcesi,i=0,1,2,3,4):

用信号量实现实时多任务管理(二)

四、 数据结构定义:
数据:

Typedef struct tagHttpTask
{
ULONG ulDstModName;
CHAR  szFilePathName[MAX_FILENAMELEN+1];
}HttpTask_S
循环队列: 
#define MAX_TASK  100
Typedef struct tagCycleQueue
{
Int  iwtFront;
Int  irdRear;
HttpTask_S  stTask[MAX_TASK];
}

队列空:

iwtFront == irdRear 

队列满:

(iwtFront+1 ) %MAX_TASK ==  irdRear
获取任务:
#define WORK_THREAD  5
Http_Task_S  szGetTask[ WORK_THREAD];
信号量:
#define  SEM_NUM     2+ WORK_THREAD
#define  SemCycle       0
#define  SemDistrib      1
#define  SemWorkBase   2
Unsigned shot arry[SEM_NUM];