Multithreading 螺纹端接

Multithreading 螺纹端接,multithreading,winapi,memory,pointers,Multithreading,Winapi,Memory,Pointers,我正在开发一种多线程的下载管理器。 每个线程都有自己的ID/句柄/URL/等 我想实现暂停/恢复/取消下载之类的功能。 我将线程句柄存储在listview中,以便挂起/恢复/终止下载线程。我还没有尝试挂起/恢复,因为我目前正在处理取消下载。唯一的问题是,如果我挂起一个线程,FileHandles/DLHandles不会关闭。 因为手柄叠在螺纹中。是否有可能获取我传递给CreateThread的指针 如何创建线程 type PTR_Download = ^TTDownload; TTDownl

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

我想实现暂停/恢复/取消下载之类的功能。 我将线程句柄存储在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;
我基本上只需要关闭终止线程的打开句柄。
有什么想法吗?

请为您正在使用的语言添加一个标记。看起来像旧的非OO Pascal-Delphi,去掉了所有好东西:您是否支持异常-如果您从另一个线程关闭打开的HTTP客户端套接字句柄,会发生什么?如果它已经关闭了怎么办?我无法关闭另一个线程的句柄,因为它们的句柄堆积在线程中。如果线程终止,所有句柄都将消失…如果要停止下载,则必须保存。。使线程/套接字/任何可访问的东西。在OO语言中,DL是一个类,保存在列表或向量中。您需要对DL-ponter执行类似的操作—将其保存在动态数组中,或者类似的操作。如果您想稍后引用DL以阻止它们,则不能触发并忘记DL。