用idhttp 多线程下载网页
假如 有1000 个页面 需要下载 起10个线程下载 当一个线程 执行完毕 就要有一个新的页面下载线程启动 总要保持当前有 10个线程下载
一直循环 下载完毕 乱了 不知道怎么写了
假如 有1000 个页面 需要下载 起10个线程下载 当一个线程 执行完毕 就要有一个新的页面下载线程启动 总要保持当前有 10个线程下载
一直循环 下载完毕 乱了 不知道怎么写了
解决方案 »
- 改写C++的UDP文件传输协议包
- 呵呵,小问题,来看看呀
- v300() 请进,在线等
- 数据类型问题[简单系列]
- 一个Active X控件(条码打印)barcod的打印方法?
- 翻译软件是如何实现把选定文字如E文换成中文的。
- 如何用query删除一个表中的全部记录????????????????????
- 如何通过程序获取DLL(全部为ICO,BMP,GIF)文件中的资源文件名称.
- 请问手机MODEM是什么?用手机数据线与PC串口相连在PC上看手机短消息是否可以不需要那个MODEM?
- 关于SQL的若干问题???在线等待
- delphi中 DMMainDate.sctClient编译不了提示Undeclared identifier: 'sctClient'
- ToolBar上的按钮大小怎么不能自动调整?
问题是 我要 起 10 个线程 同时下载
一直把 1000 个 网页地址 下载完毕 线程 create 时传入了 页面地址参数
一直等到1000个页面都下载完毕.
没必要使用mythread.OnTerminate:=MyDone;
这样的话,一直创建IDHTTP和一直释放IDHTTP.
BOOL GetExitCodeThread(
HANDLE hThread, // handle to the thread
LPDWORD lpExitCode // termination status
);
If the specified thread has not terminated, the termination status returned is STILL_ACTIVE. If the thread has terminated, the termination status returned may be one of the following: The exit value specified in the ExitThread or TerminateThread function.
The return value from the thread function.
The exit value of the thread's process.
一个 线程 结束后 会有 OnTerminate 事件,在OnTerminate 事件里可以给一个标志线程状态的变量赋值,在OnTerminate 事件里能否创立新的线程?
每个线程都是死循环:
while true do
begin
if urls空了 then
break;
从urls取一个来下载,
删除这个url,
然后开始下载
end;
while true do
begin
LockList;
if List_URL.count=0 then
break;
从urls取一个来下载,
删除这个url,
UnLockList; 然后开始下载
end;
//LockList,UnLockList是你自己定义加锁解锁过程
先定义一个锁
Var
Flock:TRTLCriticalSection;.....
InitializeCriticalSection(Flock);//初始化锁,这样才能用Procedure LockList;
begin
EnterCriticalSection(FLock);//进入锁,别的线程执行到的时候会排队等待前面的线程解锁
end;Procedure UnLockList;
begin
LeaveCriticalSection(FLock);
end;
我没加锁
具体的你可以去看下操作系统原理中关于多任务管理方面的内容,很相近的。
在循环里设置一个全局变量表示URL的数值,得到一个页面的源码后,使这个全局变量+1(此时使用临界保护)在循环里判断一下这个值是否大于了现有的URL数值,如果大于了就跳出循环
我是这么创建的
for i := 0 to 9 do //10个线程 启动
begin
mythread := THtmlThreade.Create(Memo_url.Lines.Strings[i], 'isb', GT_Session,mmo1, Memo1, Label1);
mythread.OnTerminate := MyDone;
mythread.Resume;
end;
另外 再线程里用到 CoInitializeEx 单个线程任务 执行时间很短 运行时间长了 会报Out Of Memory 存储空间不足 无法完成此操作 程序关闭是线程内代码造成的 还是 主线程里反复创建子线程造成的
这样你的程序结构会非常简单...也许代码也没多少:)
目前 我就是 terminated 里 起线程 结束一个 起一个 保持平衡 凑合用吧