此文章是vip文章,如何查看?  

1,点击链接获取密钥 http://nicethemes.cn/product/view29882.html

2,在下方输入文章查看密钥即可立即查看当前vip文章


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

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

 

本文链接http://element-ui.cn/news/show-577380.aspx