-->

对于设置的InternetReadFile超时(WinInet的德尔福+)(Set timeout

2019-10-17 01:15发布

我的应用程序需要处理的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超时。 对于某些网址,它就会为整个分钟有时卡住。 什么是强迫在这个周期超时的最佳方式?

Answer 1:

如果配置的超时没有效果(这是一个已知的bug),那么你应该关闭连接处理,这将迫使相关的功能失效,从而控制权返回给你的程序。 微软的文章Q224318 ,“如何通过创建第二个线程控制连接超时值”,介绍如何做到这一点。 (您需要一个单独的线程,因为其他线程被卡等待InternetReadFile返回。)



文章来源: Set timeout for InternetReadFile (WinInet + Delphi)