-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDownloadData.cpp
173 lines (160 loc) · 3.38 KB
/
DownloadData.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
////////////////////////////////////////////////////
//设计者姓名:LWZ小组 刘克东 00348231
//项目名:大实习-搜索引擎-网络化爬虫
//创建日期:2004-12-10
//最近一次修改日期:2004-12-26
//
// DownloadData.cpp: implementation of the DownloadData class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "NetCrawler.h"
#include "afxmt.h"
#include "DownloadData.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
DownloadData::DownloadData()
{
uCur_URLnum=0; //初始化当前队列中URL数量为0
uMaxSizeOfContainer=4000; //URL队列最大容量
uCur_URLptr=0; //当前队列头部指针
uCur_ActiveThread=0; //当前活动线程数量为0
uMaxThreadNum=10; //初始化线程数目10
uCur_Fileid=1; //初始化本地文件名称为1
str_LocalDir="C:\\"; //初始化本地文件目录为C:
}
DownloadData::~DownloadData()
{
}
//是否URL队列已经满了
bool DownloadData::IsEmpty()
{
criSection.Lock();
bool r=(uCur_URLnum<=uCur_URLptr);
criSection.Unlock();
return r;
}
//是否URL已经存在于队列中
bool DownloadData::IsExisted(CString &str)
{
criSection.Lock();
for(UINT i=0;i<uCur_URLnum;i++)
{
if(URLcontainer[i]==str)
{
criSection.Unlock();
return TRUE;
}
}
criSection.Unlock();
return FALSE;
}
//是否URL队列空了(无未处理的URL)
bool DownloadData::IsFull()
{
criSection.Lock();
bool r=(uCur_URLnum==uMaxSizeOfContainer);
criSection.Unlock();
return r;
}
//获得当前活动线程数目
UINT DownloadData::GetCurThread()
{
criSection.Lock();
UINT n=uCur_ActiveThread;
criSection.Unlock();
return n;
}
//获得最大线程数目
UINT DownloadData::GetMaxThreadnum()
{
return uMaxThreadNum;
}
//线程开始,向数据区添加一个线程记录,成功返回true
bool DownloadData::AddThread()
{
criSection.Lock();
if(uCur_ActiveThread==uMaxThreadNum)
{
criSection.Unlock();
return FALSE;
}
uCur_ActiveThread++;
criSection.Unlock();
return TRUE;
}
//线程结束后,从数据区删除一个线程记录,成功返回true
bool DownloadData::DeleThread()
{
criSection.Lock();
if(uCur_ActiveThread==0)
{
criSection.Unlock();
return FALSE;
}
uCur_ActiveThread--;
criSection.Unlock();
return TRUE;
}
//从共享数据区URL队列头取出一个URL
bool DownloadData::GetCurURL(CString &str)
{
criSection.Lock();
if(uCur_URLptr>=uCur_URLnum)
{
criSection.Unlock();
return FALSE;
}
str=URLcontainer[uCur_URLptr];
uCur_URLptr++;
criSection.Unlock();
return TRUE;
}
//向共享数据区URL队列尾添加一个URL
bool DownloadData::AddURL(CString &str)
{
criSection.Lock();
if(uCur_URLnum==uMaxSizeOfContainer)
{
criSection.Unlock();
return FALSE;
}
URLcontainer[uCur_URLnum]=str;
uCur_URLnum++;
criSection.Unlock();
return FALSE;
}
//获得当前本地存储文件的地址
void DownloadData::GetFileName(CString &str)
{
criSection.Lock();
CString str_temp;
str_temp.Format(_T("%d"),uCur_Fileid);
str=str_LocalDir+str_temp+".txt";
uCur_Fileid++;
criSection.Unlock();
}
//根据用户设定起始文件名称,最大线程数量,保存路径
bool DownloadData::SetPro(UINT Fileid, UINT ThreadNum, CString &str)
{
if(str[str.GetLength()-1]!='\\')
str+="\\";
str_LocalDir=str;
uCur_Fileid=Fileid;
uMaxThreadNum=ThreadNum;
return TRUE;
}
//显示URL队列内容(调试用)
void DownloadData::showURL()
{
for(UINT i=0;i<uCur_URLnum;i++)
{
AfxMessageBox(URLcontainer[i]);
}
}