gpt4 book ai didi

multithreading - 从互联网下载文件,同时能够随时中止下载

转载 作者:行者123 更新时间:2023-12-03 14:52:21 24 4
gpt4 key购买 nike

我想在专门用于下载的单独线程中从我的 Delphi 程序下载文件。

问题是主程序可以随时关闭(因此下载线程也可以随时终止)。因此,即使没有连接或服务器延迟了宝贵的几秒钟,我也需要一种方法在一两秒内终止下载线程。

你们推荐使用什么功能?

我已经尝试过 InterOpenURL/InternetReadFile 但它没有超时参数。它确实有一个异步版本,但我找不到任何可用的 Delphi 示例,并且我不确定异步版本是否会保护我免于挂起...

之前有人推荐过使用socket,但是TClientSocket好像也没有超时功能。

我需要做好充分准备,这样如果用户的计算机出现互联网连接问题或网络服务器持续滞后,我的应用程序在关闭之前不会挂起。

回答时请记住,我既不想使用任何第三方组件,也不想使用 Indy。非常感谢任何示例代码。

谢谢!

最佳答案

这有效。

var
DownloadAbort: boolean;

procedure Download(const URL, FileName: string);
var
hInet: HINTERNET;
hURL: HINTERNET;
Buffer: array[0..1023] of AnsiChar;
BufferLen, amt: cardinal;
f: file;
const
UserAgent = 'Delphi Application'; // Change to whatever you wish
begin
DownloadAbort := false;
hInet := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
hURL := InternetOpenUrl(hInet, PChar(URL), nil, 0, 0, 0);
try
FileMode := fmOpenWrite;
AssignFile(f, FileName);
try
Rewrite(f, 1);
repeat
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
BlockWrite(f, Buffer[0], BufferLen, amt);
if DownloadAbort then
Exit;
until BufferLen = 0;
finally
CloseFile(f);
end;
finally
InternetCloseHandle(hURL);
end;
finally
InternetCloseHandle(hInet);
end;
end;

实际上,上面的代码将成为线程的 Execute 方法的一部分,并且您不需要 DownloadAbort;相反,你检查

if Terminated then
Exit;

关于multithreading - 从互联网下载文件,同时能够随时中止下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3548479/

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