線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1610
推到 Plurk!
推到 Facebook!

請教 XE7 ThreadPool 問題

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


發表:115
回覆:106
積分:59
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-02-03 10:59:35 IP:122.146.xxx.xxx 訂閱
Hi,各位先進大家好:
不知道大家是否有玩玩看XE7的parallel programming library?
小弟想利用其中的TThreadPool來處理一些Job(例如分段下載檔案)
如下, Button 1 如預期每次處理二個Job,之後等 5 秒再處理第二組,
但, Button 2卻是等候 5 秒後全部結果顯示出來,
為何,是否有先進能指導一下,
謝謝!

constructor TWorkThread.Create(ID: Integer);
begin
inherited Create(True);
FreeOnTerminate := True;
FThreadID := ID;
end;
procedure TWorkThread.Execute;
begin
Sleep(5000);
TThread.Synchronize(nil, procedure
begin
Form1.Memo1.Lines.Add(IntToStr(FThreadID) ' : ' DateTimeToStr(Now));
end);
Terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Pool: MyThreadPool.TThreadPool; // 改寫,以便處理低於 CPU 數量的 MaxWorkThread
Tasks: Array of ITask;
i: Integer;
begin
Pool := MyThreadPool.TThreadPool.Create;
Pool.SetMaxWorkerThreads(2);
Pool.SetMinWorkerThreads(0);
SetLength(Tasks, 5);
for i := 0 to 4 do begin
Sleep(5000);
TThread.Synchronize(nil, procedure
begin
Form1.Memo1.Lines.Add(DateTimeToStr(Now));
end);
end, Pool);
Tasks[i].Start;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Pool: MyThreadPool.TThreadPool;
Threads: Array of TWorkThread;
Tasks: Array of ITask;
i: Integer;
begin
Pool := MyThreadPool.TThreadPool.Create;
Pool.SetMaxWorkerThreads(2);
Pool.SetMinWorkerThreads(0);
SetLength(Threads, 5);
SetLength(Tasks, 5);
for i := 0 to 4 do begin
Tasks[i] := MyThreadPool.TTask.Create(procedure
begin
Threads[i] := TWorkThread.Create(i);
Threads[i].Resume;
end, Pool);
Tasks[i].Start;
end;
end;

aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-02-06 17:54:10 IP:36.229.xxx.xxx 訂閱
你的button1程式碼似乎沒貼好,不太明白。

而button2 ,5秒後全出來是正常的。因為…看仔細喔:

你想用 max 2 條thread來擋 (對吧?),但由於你的task 本身也是再去 create 一條 thread 出來,所以…

你試想, create 一條thread 請它 resume 要多少時間? 這二行肯定不用1秒鐘。

於是, pool 裡的 那2 thread 輕鬆的可以把 "5" 個task 在一秒內搞定。換如話說,不出 1 秒, 5個task 就處理完了。

接著,被創出的 thread 因為 都 sleep 5秒 後開跑…

所以你看到的 光景就是 約 5秒 時 通通 都跑完了啦!


------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2015-02-06 17:56:52, 註解 無‧
系統時間:2017-12-14 12:26:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!