cxiマルチスレッドプログラミング入門編


最初は派手な文字だったはずですが、まずはやってみて理解することを勧めます。
まずこれを試してみます
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 500000 do
begin
Canvas.TextOut(10, 10, IntToStr(i));
end;
end;


のプログラムが される 、 のフォームは に「 」です。プログラム にフォームをドラッグしてみてもいいです。Delphiは な を してくれました。
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 500000 do
begin
Canvas.TextOut(10, 10, IntToStr(i));
Application.ProcessMessages;
end;
end;


このアプリ.Process Message; には、 がかかるサイクルでは、メッセージのキューの の のメッセージをチェックして します。しかし、これはマルチスレッドとは えません。 えば、 にフォームをドラッグすると、ループが します。マルチスレッドを う に、 にプログラムを してみましょう。
function MyFun: Integer;
var
i: Integer;
begin
for i := 0 to 500000 do
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(10, 10, IntToStr(i));
Form1.Canvas.Unlock;
end;
Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MyFun;
end;


い の のプログラムの :1、まずこれはまだマルチスレッドのではありませんて、フォームをも“ ”の1 を させます;2、 コードを つの に いたが、この はTForm 1の ではないので、Canvasを うには を けなければなりません。3、 である 、( であろうとなかろうと) り があるべきです。4、500001 のロックとアンロックを っています。 えば、キャンバスは しいです。 にキャンバスを いたいです。Canvas.Ulock: い わったら、ロックを します。Canvasでロックとユニックを うのはいい です。マルチスレッドを わない は ですが、いつかプログラムがマルチスレッドに されます。 は マルチスレッドを していますが、もちろん うべきです。Delphiでマルチスレッドを うには つの があります。APIを び して、TThread を います。APIのコードを うほうが です。
function MyFun(p: Pointer): Integer; stdcall;
var
i: Integer;
begin
for i := 0 to 500000 do
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(10, 10, IntToStr(i));
Form1.Canvas.Unlock;
end;
Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ID: THandle;
begin
CreateThread(nil, 0, @MyFun, nil, 0, ID);
end;


コード :CreateThreadのスレッドを した 、 のスレッドを します。このようにプログラムには2つのスレッドがあり、 のマルチスレッドです。CreateThreadの つ のパラメータは ポインタで、 しいスレッドができたらすぐにこの を します。このスレッドを してマルチスレッドの を します。CreateThreadが う はシステムレベルです。 ( えば、TForm 1)の ではなく、 なフォーマット(パラメータ、 り )が されます。しばらくは であろうとなかろうと、 ず によって なければなりません。システムレベルの び しなので、stdcalを けます。stdcalは パラメータの です。ここでは つのパラメータしか がないですが、システム を う です。CreateThreadは しいスレッドのIDを け れるためにvarパラメータが です。まだ えませんが、これもフォーマットです。 のパラメータは で しましょう。このように なマルチスレッドプログラムが ます。TThread で します。
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;

procedure TMyThread.Execute;
var
i: Integer;
begin
FreeOnTerminate := True; { }
for i := 0 to 500000 do
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(10, 10, IntToStr(i));
Form1.Canvas.Unlock;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create(False);
end;


TThread には な がありますので、 な は き ぎしか えません。 はTMyThreadとして き ぎます。TThreadを するのは に な を するExecuteです。TMyThreadの を って、まずExecute のコードを します。 りに します。
MyThread はここでは の にも たないので、 TMyThread.reate(False)に くほうがいいです。 たちは に を できます。TMyThread.reate(True)?このようにスレッドが されたら、 ちにExecuteを び すことはできません。 な にResume でスレッドを することができます。 えば、
procedure TForm1.Button1Click(Sender: TObject);
var
MyThread: TMyThread;
begin
MyThread := TMyThread.Create(False);
end;
TThreadクラスを う 、Delphiは するテンプレートがありますが、IDEでコードを くのはとても です。 き して してみます。の にCtrl+J、Shift+Ctrl+C、Ctrl+Alt+Pなどのショートカットキーを いました。
な と :
TThread の では、Free OnTerminate:=True;もとは かして、コードの ですでに えました;でもアニメにはついていけません。まず、どういう ですか?クラスクリアーはFreeになります。しかし、TThreadには があり、 しいスレッドがいつ されるかは できない が いです。もしスレッドが されたら、 でリリースを っています。だから、TThreadはブール のFree OnTerminateを えました。Trueのために、スレッドが されたら、リリースします。どうしてこんなに な を しましたか? は つあります。2、 は に1 の だけではなく、Free OnTerminateのデフォルト はTrueであると しています。 されたら、Falseであるべきです。 なくともDelphi 2007と2009の ではそうです。 のバージョンは と っているかもしれません。