我正在开发一种多线程的下载管理器。 每个线程都有自己的ID /句柄/ URL /等。
我想实现Pause / Resume / Cancel下载之类的东西。 我将ThreadHandles存储在listview中,因此我可以暂停/恢复/终止下载线程。我还没有尝试暂停/恢复,因为我正在努力取消下载。唯一的问题是如果我挂起一个线程,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;
我基本上只需要关闭已终止线程的打开句柄。 任何想法?