delphiXE关于线程和多线程、线程的同步与异步执行

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

喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享:

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专讲冷知识

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值