tonboです。
このメーリングリストには大変お世話になっています。
TTask.Createの立上りが遅く困っています。
環境:Windows7 32bit + Delphi XE8
Windows10 64bit + Delphi Seatle でも同じ
FormにButton 2つ(タスク開始、タスク終了)を貼り付け、
IDE上で、表示/デバッグ/スレッドで「スレッドの状態」を
表示しながら、以下のプログラムを実行します。
4つのタスクは即立ち上がるのですが、5つ目から
1つ1秒づつかかり、10個全て立ち上がるのに6.5秒
かかる様子が見えます。
立上り時間を表示するように修正し、IDEではなくEXEを
直接実行させても同じく6.5秒かかります。
(=IDEが原因ではない)
質問1:TTask.Createの立上りはこんなに遅いものでしょうか?
質問2:立上りを早めることができますでしょうか?
質問3:できない場合、TTask.Create以外で短時間で
立ち上がる使い易いThreadはありますでしょうか?
実際の運用では20個のタスクを立ち上げます。
この時は16.5秒もかかり実用に耐えません。
ご指導よろしくお願いします。
プログラム全文
//------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
System.Threading;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
procedure Task0;
procedure Task1;
procedure Task2;
procedure Task3;
procedure Task4;
procedure Task5;
procedure Task6;
procedure Task7;
procedure Task8;
procedure Task9;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
tasks : array of ITask;
TaskStop : Boolean;
procedure TForm1.Button1Click(Sender: TObject);
//タスク開始
begin
Setlength (tasks ,10);
TaskStop := False;
tasks[0] := TTask.Create (Task0);
tasks[0].Start;
tasks[1] := TTask.Create (Task1);
tasks[1].Start;
tasks[2] := TTask.Create (Task2);
tasks[2].Start;
tasks[3] := TTask.Create (Task3);
tasks[3].Start;
tasks[4] := TTask.Create (Task4);
tasks[4].Start;
tasks[5] := TTask.Create (Task5);
tasks[5].Start;
tasks[6] := TTask.Create (Task6);
tasks[6].Start;
tasks[7] := TTask.Create (Task7);
tasks[7].Start;
tasks[8] := TTask.Create (Task8);
tasks[8].Start;
tasks[9] := TTask.Create (Task9);
tasks[9].Start;
end;
procedure TForm1.Button2Click(Sender: TObject);
//タスク終了
begin
TaskStop := True;
end;
procedure TForm1.Task0;
begin
while True do
begin
if TaskStop = True then Exit;
sleep(1);
end;
end;
procedure TForm1.Task1;
begin
while True do
begin
if TaskStop = True then Exit;
sleep(1);
end;
end;
procedure TForm1.Task2;
begin
while True do
begin
if TaskStop = True then Exit;
sleep(1);
end;
end;
procedure TForm1.Task3;
begin
while True do
begin
if TaskStop = True then Exit;
sleep(1);
end;
end;
procedure TForm1.Task4;
begin
while True do
begin
if TaskStop = True then Exit;
sleep(1);
end;
end;
procedure TForm1.Task5;
begin
while True do
begin
if TaskStop = True then Exit;
sleep(1);
end;
end;
procedure TForm1.Task6;
begin
while True do
begin
if TaskStop = True then Exit;
sleep(1);
end;
end;
procedure TForm1.Task7;
begin
while True do
begin
if TaskStop = True then Exit;
sleep(1);
end;
end;
procedure TForm1.Task8;
begin
while True do
begin
if TaskStop = True then Exit;
sleep(1);
end;
end;
procedure TForm1.Task9;
begin
while True do
begin
if TaskStop = True then Exit;
sleep(1);
end;
end;
end.
MLホームページ:
http://www.freeml.com/delphi-users
----------------------------------------------------------------------
お酒も健康も大切。そんな方から選ばれています。
しじみの栄養を毎日手軽に摂れるように、そう考えて開発されました。
しじみの良さを引き出した「しじみ習慣」。
まずは、10日間無料でお試しください。全国送料無料。
http://ad.freeml.com/cgi-bin/sa.cgi?id=pvBas
------------------------------------------------------[freeml byGMO]--