全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2460
推到 Plurk!
推到 Facebook!

主线程怎么样才可以得到子线程中的下载进度

答題得分者是:malanlk
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-15 20:16:11 IP:218.59.xxx.xxx 未訂閱
在多线程中动态创建了indy的idhttp,怎么样才可以让主线程得到子线程的下载进度?
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-16 11:21:36 IP:203.69.xxx.xxx 未訂閱
在 MYdownHread 加個 private 變數 FDowloadPercent: Integer; 再加上 property DowloadPercent: Integr read FDowloadPercent write FDowloadPercent; 然後在 MyidhttpWorkBegin 記下總傳輸大小, MyidhttpWork 算出FDowloadPercent. 主程式在適當時機檢查 MYdownHread.DowloadPercent 的值即可
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-16 17:56:17 IP:218.59.xxx.xxx 未訂閱
谢谢老哥!    有一问题:现在象我上面的那个代码,我还是无法取得动态创建的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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-16 18:20:49 IP:218.59.xxx.xxx 未訂閱
简要的说是: 要在TidHTTP下载的过程中取得它的工作进度(即已经下载了多少字节),这个我知道是用它的onWORK事件去取得:procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer), 但是由于是动态创建的,所以我找不到合适的方法,怎么才能把每个线程中的TidHTTP的onWORK事件中的AworkCount值取出来
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-16 18:35:13 IP:203.69.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-16 18:57:01 IP:203.69.xxx.xxx 未訂閱
這樣的基本型態可以發展成用 ㄧ個 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-16 19:14:56 IP:218.59.xxx.xxx 未訂閱
谢谢谢谢! 我今晚照您的研究一下,呵呵……这个问题困绕我近一个星期了!呵呵……
lonmener
一般會員


發表:16
回覆:32
積分:9
註冊:2005-08-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-17 09:27:44 IP:218.59.xxx.xxx 未訂閱
第一项:取出每个线程的下载量已成功,第二项:管理线程,正在学习中, 我先结贴,有问题时我再重新发贴;呵呵...
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-11-28 01:16:32 IP:61.230.xxx.xxx 訂閱
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
系統時間:2024-04-26 16:38:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!