1

私は、マルチスレッドの一種のダウンロード マネージャーに取り組んでいます。各スレッドには独自の 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;

基本的に、終了したスレッドから開いているハンドルを閉じるものだけが必要です。何か案は?

4

0 に答える 0