16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"1つのスレッドを何度も使いまわす"
この発言に対し以下のコメントが寄せられています
#00973 Satobe さん RE:1つのスレッドを何度も使いまわす
◆解説
生成した1つのスレッドを「破棄せずに」何度も使いまわすサン
プルです。
◆動作確認
Delphi3.1 + Win98
◆実際のコード
Form1に Memo1, Edit1, Button1を置いて、以下のコードをお試し
下さい。
----- ここから -----
type
TMyThread = class(TThread)
private
FRestartFlag: Boolean;
FStartNo: Integer;
FSL: TStrings;
FAddStr: String;
procedure Clear;
procedure Add;
public
constructor Create;
procedure Execute; override;
procedure Start(SL: TStrings; StartNo: Integer);
end;
TForm1 = class(TForm)
..省略
private
FMyThread: TMyThread;
..省略
implementation
constructor TMyThread.Create;
begin
inherited Create(True); //Suspend状態で生成する
FRestartFlag := False;
FStartNo := 0;
FSL := nil;
//FreeOnTerminate := True;
end;
procedure TMyThread.Execute;
var
State, No, EndNo: Integer;
begin
while not Terminated do begin
//例外発生で終わらないように
try
FRestartFlag := False;
State := 0;
while (not Terminated) and
(not FRestartFlag) do begin
case State of
0:begin
Synchronize( Clear ); //FSLをクリア
No := FStartNo;
EndNo := No + 9;
inc(State);
end;
1:begin
FAddStr := IntToStr(No);
Synchronize( Add );
Sleep(500); //※for DEBUG
inc(No);
if No > EndNo then State := -1; //完了した
end;
else //完了したらSuspend
Suspended := True;
end;
end;
except
on E:Exception do begin
if not(E is EAbort) then Application.ShowException(E);
if E is EThread then Exit;
Suspended := True;
end;
end;
end;
end;
procedure TMyThread.Start(SL: TStrings; StartNo: Integer);
begin
Suspended := True; //一時停止
//リスタート情報設定
FRestartFlag := True;
FStartNo := StartNo;
FSL := SL;
Suspended := False; //一時停止解除
end;
procedure TMyThread.Clear;
begin
if Assigned(FSL) then FSL.Clear;
end;
procedure TMyThread.Add;
begin
if Assigned(FSL) then FSL.Add(FAddStr);
end;
//スレッドオブジェクトの生成&破棄
procedure TForm1.FormCreate(Sender: TObject);
begin
FMyThread := TMyThread.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FMyThread) then begin
FMyThread.Terminate;
while FMyThread.Suspended do
FMyThread.Suspended := False;
FMyThread.Free;
end;
end;
//スレッド動作開始
procedure TForm1.Button1Click(Sender: TObject);
begin
if Assigned(FMyThread) then begin
FMyThread.Start(Memo1.Lines,
StrToIntDef(Edit1.Text, 0));
end;
end;
----- ここまで -----
Edit1に数値を入力して Button1のクリックでスレッドが動作開
始します。
スレッドの動作は、Startメソッドで指定された数値から10個の
通し番号をTStrings(この例ではMemo1.Lines)に追加する、と
いう単純なものです。
※動作確認しやすいように Sleepで遅くしてあります。
もちろんスレッド動作中に再度Button1をクリックしてもまった
く問題ありません。
99/11/04(木) 23:50 Satobe(JCG00336)
Original document by Satobe 氏 ID:(JCG00336)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|