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];