终止TTask.Run启动的线程
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启动的线程的更多相关文章
- 启动一个线程是用run()还是start()?
启动一个线程是用run()还是start()? 答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运行.run ...
- Java start和run启动线程的区别
我们知道,我们通过调用线程的start方法启动一个线程,那么,我们可以直接调用run方法来启动一个线程吗? 先看下面一段代码: public class Test { public static vo ...
- 启动一个线程是调用 run()还是 start()方法?
启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状态, 这意味着它可以由 JVM 调度并执行,这并不意味着线程就会立即运行.run()方 法是线程启动后要进行回调(callb ...
- JAVA - 启动一个线程是用run()还是start()?
JAVA - 启动一个线程是用run()还是start()? 启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运 ...
- 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理
1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...
- gunicorn结合django启动后台线程
preload 为True的情况下,会将辅助线程或者进程开在master里,加重master的负担(master最好只是用来负责监听worker进程) django应用的gunicorn示例:只在主线 ...
- Gunicorn+Flask中重复启动后台线程问题
假设程序如下: if __name__ == '__main__': t = Thread(target=test) t.start() app.run(host='0.0.0.0',port=808 ...
- Java自学-多线程 启动一个线程
Java 创建一个线程的三种方式 多线程即在同一时间,可以做多件事情. 创建多线程有3种方式,分别是继承线程类,实现Runnable接口,匿名类 步骤 1 : 线程概念 首先要理解进程(Process ...
- c#笔记之启动新线程
可已通过下面方法来启动一个新线程并执行相应的方法 new Thread(new ThreadStart(new Action(() => { ...
随机推荐
- csu oj 1342: Double
Description 有一个由M个整数组成的序列,每次从中随机取一个数(序列中每个数被选到的概率是相等的)累加,一共取N次,最后结果能被3整除的概率是多少? Input 输入包含多组数据. ...
- 牛客练习赛32 A/B/C
https://ac.nowcoder.com/acm/contest/272/A v<=k时 答案就是k个1 否则贪心的从中间向两边添加1 #include<bits/stdc++.h ...
- MyBatis动态传入表名
mybatis里#{}与${}的用法: 在动态sql解析过程,#{}与${}的效果是不一样的: #{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符. 如以下 ...
- 509. Fibonacci Number斐波那契数列
网址:https://leetcode.com/problems/fibonacci-number/ 原始的斐波那契数列 运用自底向上的动态规划最佳! 可以定义vector数组,但是占用较多内存空间 ...
- Oracle 11.2.0.4.0 Dataguard部署和日常维护(3)-Datauard监控篇
1. v$database 查看当前数据库的角色和保护模式 primary库查看 column NAME format a10 column PROTECTION_MODE format a2 ...
- iOS 强大第三方资源库
Github用法 git-recipesGit recipes in Chinese. 高质量的Git中文教程. lark怎样在Github上面贡献代码 my-git有关 git 的学习资料 giti ...
- 【转】SQLServer汉字转全拼音函数
USE Test go IF OBJECT_ID('Fn_GetQuanPin','Fn') IS NOT NULL DROP FUNCTION fn_GetQuanPin go create fun ...
- ScheduledThreadPoolExecutor
java提供了方便的定时器功能,代码示例: public class ScheduledThreadPool_Test { static class Command implements Runnab ...
- GNU和GPL的区别/关系
GUN:GNU's Not UNIX的缩写,是一项运动.是1983年Richard Stallman针对UNIX走向毕源和和收费后发起的运动,旨在打造出一套完全开源免费的操作系统. 为了更好地实施GN ...
- Swagger 路径过滤 -PreSerializeFilters
Swagger 默认显示所有api, 如果要做路径过滤,可以这样做. //过滤,只显示部分api app.UseSwagger(c=> { c.PreSerializeFilters.Add(( ...