试着编了个多线程异步下载的程序,其中在多个任务(10个左右)执行时取消所有任务有时会有较长时间延时(20秒左右),经过跟踪发现在取消所有任务后在各个线程的InternetOpenUrl后面的event.waitfor等待了很长时间才返回(大概就是延时的时间,各个线程不等),这段代码大概如下所示,请高手帮我看看哪边有问题。。异步取消应该立刻返回才对吧
InternetOpenUrl部分的代码:
记录oldtime;
hConnect := InternetOpenUrl( hSession, PCHAR(url), nil, 0,INTERNET_FLAG_RELOAD or INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_NO_CACHE_WRITE, DWORD(self) );
if hconnect = nil then
begin
if thrd_event.WaitFor(infinite);
if Pause then //取消任务
begin
//这边跟踪打印的当前时间 - oldtime 大概从10秒-20多秒不等
end;
end;
关于状态回调的函数:
INTERNET_STATUS_HANDLE_CREATED:
begin
if my.pause then //用户取消,就设置完成事件
begin
my.thrd_event.SetEvent;
end;
pRes := PInternetAsyncResult(lpvStatusInformation);
my.hConnect := PHINTERNET(pRes.dwResult);
end;
INTERNET_STATUS_REQUEST_COMPLETE:
begin
my.thrd_event.SetEvent;
end;
//其他的状态都直接判断是否用户取消,取消则设置完成事件。
对于上述代码运行并没有出现什么问题,但就是取消多个任务时有时延时比较严重,请高手赐教。
难道异步操作取消也要等那么长延时??
InternetOpenUrl部分的代码:
记录oldtime;
hConnect := InternetOpenUrl( hSession, PCHAR(url), nil, 0,INTERNET_FLAG_RELOAD or INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_NO_CACHE_WRITE, DWORD(self) );
if hconnect = nil then
begin
if thrd_event.WaitFor(infinite);
if Pause then //取消任务
begin
//这边跟踪打印的当前时间 - oldtime 大概从10秒-20多秒不等
end;
end;
关于状态回调的函数:
INTERNET_STATUS_HANDLE_CREATED:
begin
if my.pause then //用户取消,就设置完成事件
begin
my.thrd_event.SetEvent;
end;
pRes := PInternetAsyncResult(lpvStatusInformation);
my.hConnect := PHINTERNET(pRes.dwResult);
end;
INTERNET_STATUS_REQUEST_COMPLETE:
begin
my.thrd_event.SetEvent;
end;
//其他的状态都直接判断是否用户取消,取消则设置完成事件。
对于上述代码运行并没有出现什么问题,但就是取消多个任务时有时延时比较严重,请高手赐教。
难道异步操作取消也要等那么长延时??
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货