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

請教ThreadPool 的用法

尚未結案
blue
中階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2018-08-31 12:21:52 IP:125.227.xxx.xxx 未訂閱
Hi, 各位先進大家好:
以下是小弟測試使用 ThreadPool,
有以下二個問題請教:
1.SetMaxWorkerThreads的作用為何?我想讓執行緒在限制個數下執行,可是實際上卻是依序啟動並且同時執行
2.有增加Application.ProcessMessage, 可是按下關閉視窗卻沒有作用,
謝謝!

unit Unit1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
System.Threading,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Controls.Presentation;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
Pool: TThreadPool;
Tasks: Array of ITask;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.fmx}

function CreateJob(ALabel: TLabel): TProc;
begin
Result := (procedure ( )
var
i: Integer;
begin
for i := 1 to 10000000 do begin
TThread.Synchronize(nil,
procedure
begin
ALabel.BeginUpdate();
ALabel.Text := IntToStr(i);
ALabel.EndUpdate();
Application.ProcessMessages();
end);
end;
end);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
SetLength(Tasks, 2);
Tasks[1] := TTask.Create(CreateJob(Label1) ,Pool);
Tasks[1].Start;

Tasks[2] := TTask.Create(CreateJob(Label2) ,Pool);
Tasks[2].Start;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Pool := TThreadPool.Create();
Pool.SetMaxWorkerThreads(1);
Pool.SetMinWorkerThreads(0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(Pool);
end;

end.
pcplayer99
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2018-09-04 23:23:09 IP:101.204.xxx.xxx 未訂閱
看不懂你想要达到什么目的,问题是什么?

你的这个 CODE 看起来有问题。简单说,for 是 Thread 在 run,但 run 进去后,因为 TThread.Sync 又让 Thread 停下来,等待 Main Thread 去 run。

如果有两个 Thread 同时跑 for,但因为某个 Thread 进入了 Main Thread,另外一个 Thread 就只能等待它的 Main Thread 跑完才能进入 Main Thread 跑。

所以,你这个代码,看不明白想要做什么。
blue
中階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2018-09-13 12:30:47 IP:125.227.xxx.xxx 未訂閱
Hi, 感謝 pcplayer99 大大指導:
小弟的需求是把要執行的Thread 丟入 ThreadPool 中,
但,限制一次最多只能有 SetMaxThread 的數量在跑,而不是丟幾個就幾個跑,
這不是 ThreadPool 的目的嗎?
謝謝!

===================引 用 pcplayer99 文 章===================
看不懂你想要达到什么目的,问题是什么?

你的这个 CODE 看起来有问题。简单说,for 是 Thread 在 run,但 run 进去后,因为 TThread.Sync 又让 Thread 停下来,等待 Main Thread 去 run。

如果有两个 Thread 同时跑 for,但因为某个 Thread 进入了 Main Thread,另外一个 Thread 就只能等待它的 Main Thread 跑完才能进入 Main Thread 跑。

所以,你这个代码,看不明白想要做什么。
pcplayer99
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2018-09-13 20:58:46 IP:119.137.xxx.xxx 未訂閱
Thread 你可以看作是一个 Object。
那么,ThreadPool 和普通的 ObjectPool 没区别。
系統時間:2024-11-23 16:18:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!