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();
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 := ;
end; procedure TForm15.FormCreate(Sender: TObject);
begin
FTaskIsRunning := false;
cnt := ;
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();
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 := ;
end; end.

然后,把Frame放到Form上运行,结果也正常。

将上面的Frame+Form的实现方式,换成FMX项目,在Android,Win32平台运行,也正常。

终止TTask.Run启动的线程的更多相关文章

  1. 启动一个线程是用run()还是start()?

    启动一个线程是用run()还是start()? 答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运行.run ...

  2. Java start和run启动线程的区别

    我们知道,我们通过调用线程的start方法启动一个线程,那么,我们可以直接调用run方法来启动一个线程吗? 先看下面一段代码: public class Test { public static vo ...

  3. 启动一个线程是调用 run()还是 start()方法?

    启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状态, 这意味着它可以由 JVM 调度并执行,这并不意味着线程就会立即运行.run()方 法是线程启动后要进行回调(callb ...

  4. JAVA - 启动一个线程是用run()还是start()?

    JAVA - 启动一个线程是用run()还是start()? 启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运 ...

  5. 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理

    1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...

  6. gunicorn结合django启动后台线程

    preload 为True的情况下,会将辅助线程或者进程开在master里,加重master的负担(master最好只是用来负责监听worker进程) django应用的gunicorn示例:只在主线 ...

  7. Gunicorn+Flask中重复启动后台线程问题

    假设程序如下: if __name__ == '__main__': t = Thread(target=test) t.start() app.run(host='0.0.0.0',port=808 ...

  8. Java自学-多线程 启动一个线程

    Java 创建一个线程的三种方式 多线程即在同一时间,可以做多件事情. 创建多线程有3种方式,分别是继承线程类,实现Runnable接口,匿名类 步骤 1 : 线程概念 首先要理解进程(Process ...

  9. c#笔记之启动新线程

    可已通过下面方法来启动一个新线程并执行相应的方法 new Thread(new ThreadStart(new Action(() =>                        {     ...

随机推荐

  1. Matlab-10:Ritz-Galerkin方法求解二阶常微分方程

    一.代数多项式法: tic; clear clc % N=input('please key in the value of ''N'''); N=10; M=100; h=1/M; X=0:h:1; ...

  2. ssh -vT git@github.com get “ No such file or directory” 错误

    在"Are you sure you want to continue connnecting"的时候回复y,不要打空格跳过 参考:http://stackoverflow.com ...

  3. python3+pyshark读取wireshark数据包并追踪telnet数据流

    一.程序说明 本程序有两个要点,第一个要点是读取wireshark数据包(当然也可以从网卡直接捕获改个函数就行),这个使用pyshark实现.pyshark是tshark的一个python封装,至于t ...

  4. weblogic修改安装路径教程

    我们有一个安装好的weblogic,我们想再装一个weblogic或者想把weblogic装到别的目录去,最直接的做法是从头装一个. 但是从头装一个是比较费时费力的,尤其是打补丁环节和创domain环 ...

  5. [转]一次CMS GC问题排查过程(理解原理+读懂GC日志)

    这个是之前处理过的一个线上问题,处理过程断断续续,经历了两周多的时间,中间各种尝试,总结如下.这篇文章分三部分: 1.问题的场景和处理过程:2.GC的一些理论东西:3.看懂GC的日志 先说一下问题吧 ...

  6. jedata日期控件的开始结束日期设置

    <span class="wstxt">开始日期:</span><input type="text" class="wo ...

  7. css 改变浏览器滚动条的样式

    /*滚动条样式*/ .innerbox::-webkit-scrollbar {/*滚动条整体样式*/ width: 4px; /*高宽分别对应横竖滚动条的尺寸*/ height: 4px; } .i ...

  8. JQuery操作input

    // 不可编辑 $("#id").attr("disabled","disabled"); $("#id").remov ...

  9. 变量和基本类型——复合类型,const限定符,处理类型

    一.复合类型 复合类型是指基于其他类型定义的类型.C++语言有几种复合类型,包括引用和指针. 1.引用 引用并非对象,它只是为一个已存在的对象所起的另外一个名字. 除了以下2种情况,其他所有引用的类型 ...

  10. Java Web(五) 监听器Listener

    监听器概述 在上一篇里介绍了过滤器Filter,而Listener是Servlet的另一个高级特性.Listener用于监听Java Web程序中的事件,例如创建,修改,删除Session,reque ...