私は、マルチスレッドの一種のダウンロード マネージャーに取り組んでいます。各スレッドには独自の ID/ハンドル/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;
基本的に、終了したスレッドから開いているハンドルを閉じるものだけが必要です。何か案は?