delphiXE关于线程和多线程、线程的同步与异步执行
一、最好的参照案例
{$BDS}\source\fmx\FMX.Helpers.Android.pas
如下四个独立方法:
type
TMethodCallback = procedure of object;
TCallBack = reference to procedure;
procedure CallInUIThread(AMethod: TMethodCallback); overload; //:在UI中调用线程并回调某个对象或类的事件:在自己的单元文件重新实现
procedure CallInUIThread(AMethod: TCallBack); overload; //:在UI中调用线程并回调某个匿名过程:在自己的单元文件重新实现
procedure CallInUIThreadAndWaitFinishing(AMethod: TMethodCallback); overload; //:在UI中调用线程且等待其结束并回调某个对象或类的事件:在自己的单元文件重新实现
procedure CallInUIThreadAndWaitFinishing(AMethod: TCallBack); overload; //:在UI中调用线程且等待其结束并回调某个匿名过程:在自己的单元文件重新实现
implementation
use FMX.Types, System.Generics.Collections,
System.SyncObjs, System.Rtti, System.Classes, FMX.Consts;
var
//ActiveJavaRunnables: TThreadList<TRunnable>; //改为:
ActiveThreadsRunnables: TThreadList<TRunnable>; //:活动的能运行的线程列表:uses System.Generics.Collections
initialization
ActiveJavaRunnables := TThreadList<TRunnable>.Create;
finalization
ActiveJavaRunnables.DisposeOf;
end.
二、将其稍作修改,变成你自己的通用线程执行类
三、方法:
1、简单的线程同步:
1.1、当前线程,简单的线程同步
try
//在这里写i的数据获取及处理:......
finally
TThread.Synchronize(nil,
// var :你的同步中间变量;
procedure begin
Memo1.Lines.Add( LResp.ContentAsString( System.SysUtils.TEncoding.UTF8) );
//LResp.ContentAsString(System.SysUtils.TEncoding.UTF8);
//Memo1.Lines.Add(LRespoContent.DataString); //:乱码转换下 ::这样也可以
end ); //:与UI交互,信息量少,可以这样简单短暂地阻塞一下UI;
//:若信息量大,请用异步方式处理完数据,得到通知后再加载UI
或用队列同步:
TThread.Queue(nil,
// var :你的队列中间变量;
procedure begin
//在这里写您与UI界面元素的交互代码:
end;
1.2、当前线程的匿名线程,简单的线程同步
TThread.CreateAnonymousThread (
procedure
// var :你的匿名线程中间变量;
begin
//在这里写您与UI界面元素的交互代码:
end;
1.3、当前线程的子线程,简单的线程同步
var LSubAnonymousThread :TAnonymousThread;
LSubAnonymousThread := TAnonymousThread.Create(
procedure
// var :你的匿名线程中间变量;
begin
//在这里写您与UI界面元素的交互代码:
end;
2、其它,见本博客相关文章:
2.1、Delphi中的匿名方法及异步任务:
https://blog.csdn.net/pulledup/article/details/102675723
2.2、PPL并行编程库01-概念
https://blog.csdn.net/pulledup/article/details/102063074
2.3、PPL并行编程库02-多任务
https://blog.csdn.net/pulledup/article/details/102068352
2.4、PPL并行编程库03-单任务、异步多任务、同步多任务
https://blog.csdn.net/pulledup/article/details/102081210
2.5、delphi线程监视器System.TMonitor : 若存在线程嵌套 或 与UI交互时有时需要强制同步:
https://blog.csdn.net/pulledup/article/details/105175193
2.6、请求远程数据的同步及异步处理1:
delphi Restful:客户端实现的四种方式及其比较: https://blog.csdn.net/pulledup/article/details/104132753
2.7、请求远程数据的同步及异步处理2:
案例:delphi判断网络状态是否正常: https://blog.csdn.net/pulledup/article/details/104584564
2.8、多线程同步对象及其等待结果
https://blog.csdn.net/pulledup/article/details/106136991
2.9、再谈delphi XE多线程同步对象及其管理二
https://blog.csdn.net/pulledup/article/details/106631889
喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享: