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

XE7 System.Threading 使用問題

答題得分者是:pcplayer99
blue
中階會員


發表:169
回覆:136
積分:81
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-01-13 17:21:37 IP:122.146.xxx.xxx 訂閱
Hi,各位先進大家好:
小弟想利用 XE7 的 TTask 及 ThreadPool 作 HTTP 檔案分段下載功能,
但,使用
Pool := TThreadPool.Create;

Tasks[i] := TTask.Create(procedure ()
begin
....這邊還沒譜....會使用 IdHTTP.Get 處理
end, Pool)
是否有辦法判斷那些 Task 是正常完成,那些還在處理,那些有異常?
還有內部的 Indy 的進度是否有辦法傳出來更新畫面的 UI
謝謝!
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-01-13 17:38:29 IP:59.120.xxx.xxx 訂閱
TIdSync 可以借來使用

使用方式可參閱:
TIdTCPServer and Synchronize when moving from Indy 9 to Indy

===================引 用 blue 文 章===================
Hi,各位先進大家好:
小弟想利用 XE7 的 TTask 及 ThreadPool 作 HTTP 檔案分段下載功能,
但,使用
Pool := TThreadPool.Create;

Tasks[i] := TTask.Create(procedure ()
begin
....這邊還沒譜....會使用 IdHTTP.Get 處理
end, Pool)
是否有辦法判斷那些 Task 是正常完成,那些還在處理,那些有異常?
還有內部的 Indy 的進度是否有辦法傳出來更新畫面的 UI
謝謝!
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-01-22 12:42:35 IP:120.236.xxx.xxx 訂閱
对于 Thread 的使用,你这样来理解:

1. 一个 Task 相当于一个包含了很多执行功能(Method)和数据(Data)的 Object,加上真正去 run 这些 Method 的 Thread。
2. HTTP 分段下载,就要创建多个这样的 Task 实例,然后让 Task 里面的 Thread 跑起来。
3. 因为真正 RUN CODE 的是 Thread,所以,你不能直接在 Code 里面写任何和界面操作(比如Show 一个 Message 或者改变一个 Label 的显示文字)的 Code。如果这里需要把当前执行的状态显示到界面上,一定要用【同步】。
4. 至于 Pool,这个有没有,关系不大。用 Pool 是用于避免不停地创建和释放 Object 带来的系统效率开销,不用 POOL 不妨碍你使用 Thread。

关于【同步】

传统的 Delphi 的代码里面,如果以下代码是在一个Thread来执行的:

DoSometing...
DoAnotherThing....
Self.Synchronc(ShowMyMessage); //这里是调用 TThread 的 【同步】方法,这个方法的参数,是 ShowMyMessage 方法。而 ShowMyMessage 方法里面可能有 Form1.Labe1.Caption := 'abcd'; 类似的代码。
DoOtherThing.....


在 DELPHI XE7 里面,上述同步到方法,还可以别的写法,不过意思完全一样。

上述写法,那段代码多半是在一个 TThread 的类里面,那个 Self 是指那个 Thread Object 实例。

但是,如果代码非常复杂,那段代码可能是写在其它的 Class 里面,而不是你的 Thread Class 里面。从代码架构的角度来看,那段代码根本不知道 RUN 自己的是哪个 Thread,没法写 Self.Sync....。

所以,XE7 里面有 TThread.Sync.... 这个类方法。上述代码可以直接把 Self.Sync... 改成 TThread.Sync.... 原理上大概就是这个意思。具体用法请去查一下 XE7 的 Help.


===================引 用 blue 文 章===================
Hi,各位先進大家好:
小弟想利用 XE7 的 TTask 及 ThreadPool 作 HTTP 檔案分段下載功能,
但,使用
Pool := TThreadPool.Create;

Tasks[i] := TTask.Create(procedure ()
begin
....這邊還沒譜....會使用 IdHTTP.Get 處理
end, Pool)
是否有辦法判斷那些 Task 是正常完成,那些還在處理,那些有異常?
還有內部的 Indy 的進度是否有辦法傳出來更新畫面的 UI
謝謝!
系統時間:2024-04-19 12:47:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!