unit Unit15; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Threading, kbmmwprocess, Vcl.StdCtrls, kbmMWClientDataset; type TForm15 = class(TForm) Button1: TButton; kbmMWClientTransactionResolver1: TkbmMWClientTransactionResolver; Button2: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private FTaskIsRunning: boolean; cnt: Integer; { Private declarations } public { Public declarations } end; var Form15: TForm15; implementation {$R *.dfm} procedure TForm15.Button1Click(Sender: TObject); begin FTaskIsRunning := true; TTask.Run( procedure begin while FTaskIsRunning do begin sleep(99); TThread.Synchronize(nil, procedure begin Label1.Caption := 'Thread is running...' + cnt.ToString; inc(cnt); end); end;//end while. end); end; procedure TForm15.Button2Click(Sender: TObject); begin FTaskIsRunning := false; cnt := 0; end; procedure TForm15.FormCreate(Sender: TObject); begin FTaskIsRunning := false; cnt := 0; end; end.
上面的代碼,運行正常,按Button1開啟一個線程,Button2終止線程運行。這是一個VCL項目。可以看到用一個私有變量FTaskIsRunning來控件線程中的循環。這個實現是在一個Form中,運行正常,現在換成TFrame中實現,基本上是復制Form中的實現代碼,可以忽略不看。
unit Unit16; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,System.Threading; type TFrame16 = class(TFrame) Label1: TLabel; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private FTaskIsRunning:boolean; cnt:Integer; public { Public declarations } end; implementation {$R *.dfm} procedure TFrame16.Button1Click(Sender: TObject); begin FTaskIsRunning := true; TTask.Run( procedure begin while FTaskIsRunning do begin sleep(99); TThread.Synchronize(nil, procedure begin Label1.Caption := 'Thread is running...' + cnt.ToString; inc(cnt); end); end; end); end; procedure TFrame16.Button2Click(Sender: TObject); begin FTaskIsRunning := false; cnt := 0; end; end.
然后,把Frame放到Form上運行,結果也正常。
將上面的Frame+Form的實現方式,換成FMX項目,在Android,Win32平台運行,也正常。