gpt4 book ai didi

delphi - 设置 InternetReadFile 超时 (WinInet + Delphi)

转载 作者:行者123 更新时间:2023-12-02 04:10:52 28 4
gpt4 key购买 nike

我的应用程序需要通过检索文本内容来处理 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));

我正在为每个网址读取启动单独的线程

(...)
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 例程的超时。对于某些网址,有时会卡住整整几分钟。在此周期中强制超时的最佳方法是什么?

最佳答案

如果配置的超时没有效果(这是一个已知的错误),那么您应该关闭连接句柄,这将迫使关联的函数失败,从而将控制权返回给您的程序。微软文章Q224318 “如何通过创建第二个线程来控制连接超时值”描述了如何执行此操作。 (您需要一个单独的线程,因为另一个线程陷入等待 InternetReadFile 返回。)

关于delphi - 设置 InternetReadFile 超时 (WinInet + Delphi),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11583798/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com