• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

delphi线程教学第二节:在线程时空中操作界面(UI)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
第二节:在线程时空中操作界面(UI)
 
1.为什么要用 TThread ?
 
TThread 基于操作系统的线程函数封装,隐藏了诸多繁琐的细节。
适合于大部分情况多线程任务的实现。这个理由足够了吧?
什么?你要用 windows 的线程 api 来实现多线程?
我可以负责任地告诉你,如果你用 api 来实现多线程任务,
加之你天资聪明,对 delphi 的面向对象思想掌握得非常快,
那么最终也你也会写一个与 TThread 类似的东西来提高开发效率。
何必折腾呢?要相信 delphi 的工程师,人家早已看透了一切。咳咳。
同理,要相信微软的工程师,windows 操作系统是没有啥大问题的。
更同理,要相信设计手机的工程师,不需要贴膜,人家好不容易把才手机变薄的。
哈哈,扯远了。。。
(本教程默认操作系统为 windows 7/10 , delphi 的版本为 XE8,大多数代码均能在 XE2 上运行)
 
2.线程时空中操作界面(UI)到底有什么门道?
 
很多教程中都一再强调,线程时空里,不准直接去更新 UI ,但似乎没有说明原因。
我们假设UI 界面允许多个线程同时去更新,看看会发生什么情况。
如果两个线程,同时都在界面相同的区域进行画图操作,比如一个要画绿色,一个要红色,
那么最终,界面上是不是可能出现一个大花脸?
可以这样朴实地理解,就知道为什么 UI 不允许多线程去操作了。不是不能,是不得已。
(线程中不允许直接操作 UI,在安卓下同样适用)
 
3. TThread.Synchronize() 原理。
 
是用 SendMessage 函数,发了一个 WM_NULL 消息给窗口。
窗口接到消息后再去更新界面。窗口消息响应事件可以理解为主线程时空。
 
以下是接上节的实例,来看如何正确地显示计算结果在窗口上。
 
unit Unit10;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, uAccumulation, Vcl.StdCtrls;
type
  TForm10 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure OnAccumulated(Sender: TAccumulationThread);
  end;
 
implementation
{$R *.dfm}
 
procedure TForm10.Button1Click(Sender: TObject);
var
  accThread: TAccumulationThread;
begin
  accThread := TAccumulationThread.Create(true);
  accThread
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap