お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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