delphi 安全的后台Thread线程  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi 安全的后台Thread线程


安全的后台Thread线程

德尔福线程

在后台运行长任务以保持用户界面 ( GUI ) 空闲是多线程的目标之一。


一个实际的例子如下:


procedure TForm1.Button1Click(Sender: TObject);

begin

  TThread.CreateAnonymousThread(

    procedure

    begin

      {Tarea_larga};

    end).Start;

end;

许多开发人员有一些与前一个类似的代码,用于处理数据或建立与服务器的连接。


但是如果我们需要向那个“Long_Task”的用户显示一些结果呢?


从后台进程使用GUI根本不安全,因此您必须与主线程进行某种同步,一个简单的例子如下:


procedure TForm1.Button1Click(Sender: TObject);

begin

  TThread.CreateAnonymousThread(

    procedure

    begin

      {Tarea_larga};

      TThread.Synchronize(nil,

        procedure

        begin

          {Mostrar_resultados};

        end);

    end).Start;

end;

一旦执行进入TThread.Synchronize 中的过程,它就开始在主线程的上下文中执行,因此{Show_results}应该尽可能少且不可缺少,因为它不是在后台运行,而是在主线程中正如我们已经提到的。


必须考虑到这一点,因为如果{Show_results}需要很长时间来执行,它会像我们在主线程中执行它一样阻塞GUI。


在线程中不要做什么

在许多查询中,我看到它们以以下方式在后台执行进程:


procedure TForm1.Button1Click(Sender: TObject);

begin

  TThread.CreateAnonymousThread(

    procedure

    begin

      TThread.Synchronize(nil,

        procedure

        begin

          {Tarea_larga};

          {Mostrar_resultados};

        end);

    end).Start;

end;

当您不确切知道后台线程如何工作时,上面的示例是一个非常常见的错误。


这段代码的作用是在同步块中执行 {Long_task} 和 {Show_results},即在主线程中而不是在后台执行。


这与按以下方式执行相同:


procedure TForm1.Button1Click(Sender: TObject);

begin

  {Tarea_larga};

  {Mostrar_resultados};

end;

现在您知道线程或后台执行是如何编码的,以便我们的应用程序不会被阻塞。



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.18553304672241 seconds