主线程怎么样才可以得到子线程中的下载进度 |
答題得分者是:malanlk
|
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
谢谢老哥! 有一问题:现在象我上面的那个代码,我还是无法取得动态创建的aMyidhttp的下载量; 详细说是这样:
procedure MYdownHread.Execute;
var
aFile,aURL:string;
FS:TFileStream;
aMyidhttp:TIdHTTP;
begin
aURL:=Form1.EdtURL.Text;
aFile:='1.rar';
aMyidhttp:=Tidhttp.Create(nil);
FS:=TFileStream.Create(aFile,fmcreate);
try
aMyidhttp.Get(aURL,FS);
finally
end;
{在这里怎么样才可以取到aMyidhttp的下载量?}
FS.Free;
aMyidhttp.Free;
end; 如果能取到的话我想是不是可以用sendmessage来传给主窗口的ProgressBar?
|
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
MyidhttpWorkBegin 中的參數 AWorkCountMax 就是本次預定下載大小
可以用ㄧ個 FWorkCountMax 記下來 MyidhttpWork 中的參數 AWorkCount 就是已下載大小
if (FWorkCountMax>0) then FDowloadPercent := Round(AWorkCount/FWorkCountMax*100) else FDowloadPercent := 0;因為 IdHttp.Get 會ㄧ直到資料傳完或中斷才會做到你用紅色標出的地方, 所以該處是無法取得下載量的.... 但是如果你有指定 aMyidhttp.OnWork := MyidhttpWork; aMyidhttp.OnWorkBegin := MyidhttpWorkBegin; aMyidhttp.OnWorkEnd := MyidhttpWorkEnd; aMyidhttp 就會資料取得開始時呼叫MyidhttpWorkBegin aMyidhttp 就會資料取得下載中間呼叫MyidhttpWork aMyidhttp 就會資料取得結束時呼叫MyidhttpWorkEnd 所以利用呼叫 MyidhttpWork 時去更新下載量... 而主程式在Create MYdownHread 時將 MYdownHread.FreeOnTerminate := False; MYdownHread.Resume 後就啟動一個 Timer1, Timer1.Interval := 100; 在 Timer1 的 OnTimer event 你可以這樣寫 if MYdownHread.Terminated then begin // 下載完了 或 斷線 MYdownHread.Free; MYdownHread := nil; Timer1.Enable := False; end else begin // 下載中 DowloadPercent的值會隨時被MyidhttpWork更新 ProgressBar1.Value := MYdownHread.DowloadPercent; //ProgressBar1.Max := 100; end;希望這樣寫你看的懂.... |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
這樣的基本型態可以發展成用 ㄧ個 TList 來管理 所有動態創建的 Thread 在 MYdownHread.Resume 後 TdrList.Add(MYdownHread); Timer1 可以不用再 Disable
在 Timer1 的 OnTimer event 你可以這樣寫
var i: Integer; Trd: MYdownHread; begin if (TrdList.Count=0) then Exit; for i:= TrdList.Count-1 downto 0 do begin Trd := MYdownHread(TrdList.Items[i]); if Trd.Terminated then begin // 下載完了 或 斷線 Trd.Free; TrdList.Delete(i); end else begin // 下載中 DowloadPercent的值會隨時被MyidhttpWork更新 // 用 Trd.DowloadPercent 更新對應的 Progress Bar end; end; end;希望這樣寫你看的懂.... 發表人 - malanlk 於 2005/09/16 19:01:16 |
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
|
lonmener
一般會員 發表:16 回覆:32 積分:9 註冊:2005-08-20 發送簡訊給我 |
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
trdlist要寫在主程式,還是thread中,不知道resume是在哪,希望有大大能幫忙。
===================引 用 malanlk 文 章=================== 這樣的基本型態可以發展成用 ㄧ個 TList 來管理 所有動態創建的 Thread 在 MYdownHread.Resume 後 TdrList.Add(MYdownHread); Timer1 可以不用再 Disable 在 Timer1 的 OnTimer event 你可以這樣寫 var i: Integer; Trd: MYdownHread; begin if (TrdList.Count=0) then Exit; for i:= TrdList.Count-1 downto 0 do begin Trd := MYdownHread(TrdList.Items[i]); if Trd.Terminated then begin // 下載完了 或 斷線 Trd.Free; TrdList.Delete(i); end else begin // 下載中 DowloadPercent的值會隨時被MyidhttpWork更新 // 用 Trd.DowloadPercent 更新對應的 Progress Bar end; end; end;希望這樣寫你看的懂.... 發表人 - malanlk 於 2005/09/16 19:01:16 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |