請教 XE7 ThreadPool 問題 |
答題得分者是:aftcast
|
blue
中階會員 發表:170 回覆:136 積分:81 註冊:2002-04-15 發送簡訊給我 |
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 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
你的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, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |