我的应用程序需要处理的URL列表,通过检索其文本内容。 我的网络连接是通过启动
myTimeOut:= 2000;
InternetSetOption(nil, INTERNET_OPTION_CONNECT_TIMEOUT, Pointer(@myTimeOut), SizeOf(myTimeOut));
InternetSetOption(nil, INTERNET_OPTION_SEND_TIMEOUT, Pointer(@myTimeOut), SizeOf(myTimeOut));
InternetSetOption(nil, INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@myTimeOut), SizeOf(myTimeOut));
我发起单独的线程每个URL读
(...)
read_url_threads[thread_counter]:= TReadURLThread.Create(false);
read_url_threads[thread_counter].FreeOnTerminate:= False;
read_url_threads[thread_counter].myURL:= target_url_list[i];
read_url_threads[thread_counter].output_filename:= local_output_filename;
read_url_threads[thread_counter].NetHandle:= NetHandle;
read_url_threads[thread_counter].limit_text_size:= max_length_url;
hArr[thread_counter]:= read_url_threads[thread_counter].Handle;
(...)
if (thread_counter >= max_threads) or
(thread_counter >= (target_url_list.Count)) then
repeat
rWait:= WaitForMultipleObjects(thread_counter, @hArr,True, 100);
Application.ProcessMessages;
until rWait <> WAIT_TIMEOUT;
(...)
线程执行里面我通过获取URL内容:
if Assigned(NetHandle) and (not EndsText('.pdf',url)) then
try
UrlHandle := InternetOpenUrl(NetHandle, PChar(url), nil, 0, 0, 0);
if Assigned(UrlHandle) then
try
repeat
InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
SetString(StrBuffer, PAnsiChar(@Buffer[0]), BytesRead);
Result := Result + StrBuffer;
until BytesRead = 0;
finally
InternetCloseHandle(UrlHandle);
end;
我的问题是设置为常规的InternetReadFile超时。 对于某些网址,它就会为整个分钟有时卡住。 什么是强迫在这个周期超时的最佳方式?