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. python 构造函数作用

    1. 构造函数的作用        构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作, 当创建对象时, 对象会自动调用它的构造函数.一般来说, 构造函数有以下三个方面的作用:        ...

  2. 『TensorFlow』SSD源码学习_其四:数据介绍及TFR文件生成

    Fork版本项目地址:SSD 一.数据格式介绍 数据文件夹命名为VOC2012,内部有5个子文件夹,如下, 我们的检测任务中使用JPEGImages文件夹和Annotations文件夹. JPEGIm ...

  3. 第一阶段——站立会议总结DAY07

    未做,有一些作业比较赶,所以,先搁置了它.

  4. springboot使用redis的配置application.yml连接池以及存取

    第一步:添加pom文件依赖: <!-- redis --> <dependency> <groupId>redis.clients</groupId> ...

  5. 牛客练习赛24-B-贪心

    链接:https://www.nowcoder.com/acm/contest/157/B来源:牛客网 题目描述 凤凰于飞,翙翙其羽,亦集爰止.                             ...

  6. MSSQL2012中SQL调优(SQL TUNING)时CBO支持和常用的hints

    虽然当前各关系库CBO都已经非常先进和智能,但因为关系库理论和实现上的限制,CBO在特殊场景下也会给出次优甚至存在严重性能问题的执行计划,而这些场景中,有一部分只能或适合通过关系库提供的hints来进 ...

  7. nginx配置location总结及rewrite规则写法(1)

    1. location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为 ...

  8. 百度AI认为最漂亮的中国女星是----范冰冰

    一.程序说明 1.1 程序说明 之前写调用百度AI接口的程序,然后刷到了两条明星的新闻,就想到了写个给明星颜值排下名的程序. 程序的关键点是两个,第一个是百度AI接口的调用这点其实直接使用早前实现的类 ...

  9. 整合SpringDataJPA

    JPA:ORM(Object Relational Mapping); 1).编写一个 实体类(bean)和数据表进行映射,并且配置好映射 关系: /** * Created by windMan o ...

  10. flex入门----基础知识

    传统的页面布局   在flex出现之前,双列布局,三列布局,动态盒居中,绝对居中布局等常见的布局均是采用dispaly+float+定位来布局的,一般包括以下几种布局策略: normal flow(文 ...