1

我正在开发一种多线程的下载管理器。每个线程都有自己的 ID/Handles/URL/等。

我会实现类似暂停/恢复/取消下载的功能。我将 ThreadHandles 存储在列表视图中,因此我可以暂停/恢复/终止下载线程。我还没有尝试暂停/恢复,因为我目前正在取消下载。唯一的问题是如果我挂起一个线程,FileHandles/DLHandles 不会关闭。由于句柄堆叠在线程中。是否有可能获得我为 CreateThread 传递的指针?

我如何创建线程

type
 PTR_Download = ^TTDownload;
 TTDownload = record
 URL: string;
 ThreadHandle : Longword;
 // .....
end;

function DownloadFile ( p : pointer ) : Integer; stdcall; // The Thread
var
 _infos: TTDownload;
begin
 CopyMemory(@_infos, p, SizeOf(_infos));
 DownloadFile (_infos.URL); // just example
 // .... and so on
 // .... Handles get created here FileHandle/InternetOpenHandle/etc..
end;

function StartNewDownload (Link : String)
var
 DL : PTR_Download;
 ThreadID : DWORD;
begin
 DL := PTR_Download(LocalAlloc(LPTR, SizeOf(TTDownload)));
 DL^.URL := Link;
 DL.ThreadHandle := CreateThread(nil, 0, @DownloadFile, DL, 0, ThreadID);
end;

function AnotherFunction (dummy : String) : Bool;
begin
 GetParameterPointerOfThreadHandle (AnyHandleHere) // Something like that?!
end;

我基本上只需要关闭已终止线程的打开句柄的东西。有任何想法吗?

4

0 回答 0