Delphi中多线程用Synchronize实现VCL数据同步显示 解决在线程中操作控件出现问题

原创 2011年09月06日 13:44:53

        当您使用的类层次结构的对象如TThread,其属性和方法都不能保证是线程安全的。也就是说,直接访问其他窗体属性或执行方法,则使用的内存不从受其他线程的保护。正因为如此,一个主线程是预留访问VCL和CLX对象,从而使所有的Windows组件接收到线程发送的消息时进行处理,即让应用程序上的所有控件同步使用消息循环,而实现该线程同步则需要使用到Synchronize。

         VCL实现同步方法就是调用线程类的Synchronize的过程,此过程需要一个无参数的procedure,故在此procedure中无法传递参数值,但可以通过类的成员来实现。在类的Execute中只须调用Synchronize就可以了。

   如果在线程中对VCL操作,在连续执行多次以后,会报错误或者莫名其妙的显示错误问题,如字体大小变化、字体变粗、消失等,这个问题可以由上述方法修复,把赋值操作让窗体主线程来完成。

  关键在于对Synchronize参数的定义。定义一个无参数的procedure通过它来访问其他类的成员。在类的重载Execute中调用Synchronize。

procedure TMyThread.PushTheButton;
begin
  Button1.Caption := '测试';
  Button1.Click;
end;
procedure TMyThread.Execute;
begin
  ...
  Synchronize(PushTheButton);
  ...
end;

        使用Synchronize将保证你对Button1控件的操作是线程安全的,但如果不使用Synchronize而直接在线程的Execute方法中执行因为执行不是线程安全的则会出现各种问题,如果不执行Button1的click事件,或者Button1的caption显示字体忽大忽小等。

        在应用程序中并不是所有的类需要使用主线程,因此当你知道一个对象的方法是线程安全的则可以省略使用Synchronize方法,这样将提高性能,因为不需要等待VCL或CLX线程进入消息循环:1)控件不是线程安全的,因此在对象中操作控件需要使用Synchronize方法来进行同步显示;2)图形对象是线程安全的,您不需要使用主VCL或CLX的线程访问TFont,TPEN,TBrush,TBitmap,TMetafile(VCL),TDrawing(CLX),或TICON,Canvas对象可以用来锁定外同步方法;3)列表对象不是线程安全的,你可以使用一个线程安全的版本,TThreadList,而不是TLIST。

       

Delphi:与VCL同步(Synchronize()、用消息来同步)

先说一下RTL和VCL   RTL(Run-Time library),运行时库,包括System、SysUtils、Math三个单元,提供的函数与语言、编译器、操作系统及进程有关   R...
  • u010984552
  • u010984552
  • 2016年08月26日 11:08
  • 2281

Delphi中多线程用Synchronize实现VCL数据同步显示

概述:        VCL实现同步的另一种方法就是调用线程类的Synchronize的过程,此过程需要一个无参数的procedure,故在此procedure中无法传递参数值,但可以通过类的成...
  • liwb1987
  • liwb1987
  • 2014年08月25日 14:12
  • 340

Delphi Dll线程使用Synchronize同步导致线程假死的解决方法

经试验可以在dll工程文件中加入以下语句 : Application.Initialize; if Application.Handle = 0 then begin     Appl...
  • mengzhongren2
  • mengzhongren2
  • 2017年07月13日 16:06
  • 248

Delphi中多线程同步过程Synchronize的一些说明

在windows原生应用程序开发中,经常伴随多线程的使用,多线程开发很简单,难点就是在于线程的同步,在Delphi中提供了VC中不具备的一个过程Synchronize,使用起来非常方便,解决了很多VC...
  • gogogo
  • gogogo
  • 2013年08月21日 11:41
  • 13619

关于VCL的编写 (一) 怎样编写自己的VCL控件

怎样编写自己的VCL控件       用过Delphi的朋友们,大概对Delphi的最喜欢Delphi的不是他的强类型的pascal语法,而是强大的VCL控件,本人就是一位VCL控件的爱好者。    ...
  • dreamnan
  • dreamnan
  • 2004年09月15日 13:07
  • 2237

Delphi中多线程中Synchronize的运用

Delphi中多线程用Synchronize实现VCL数据同步显示,Delphi中多线程用Synchronize实现VCL数据同步显示转自:http://blog.csdn.net/maxcode/a...
  • jiangnanandi
  • jiangnanandi
  • 2008年09月22日 17:29
  • 7090

如何在子线程中通过安全调用方法操作窗体控件

 在查询海量数据时,由于查询需要时间,因此要在查询的同时显示状态信息以通知用户当前正在进行的操作,通常采用多线程进行处理,但是初学者常常使用如下类似的代码:        //button按钮的cli...
  • cattiger75
  • cattiger75
  • 2007年11月21日 01:54
  • 3313

多线程运行同步锁synchronize的一些实战心得

同步锁的应用本质:牺牲程序执行性能而换取数据的安全变动。 原则:如果在实际开发中,在使用同步锁之前,必须先了解你要调用的同步对象,内部是否已经实现了同步,如果实现了同步,则无需加锁,否则就要加锁。 1...
  • u014104512
  • u014104512
  • 2015年03月17日 21:12
  • 1765

Java多线程之深入理解synchronize关键字

synchronize锁重入:关键字synchronize拥有锁重入的功能,也就是在使用synchronize时,当一个线程的得到了一个对象的锁后,再次请求此对象是可以再次得到该对象的锁。 当一个线...
  • qq_32120645
  • qq_32120645
  • 2017年06月07日 16:14
  • 338

Delphi使用线程TThread查询数据库

网上查了很多资料,看了很多关于线程TThread的使用,并动手操作,但均未能达到想要的效果。我所要的效果是,线程执行耗时的操作而不影响主程序,用户使用没有卡顿的感觉。知道是使用线程编程解决,后来经过不...
  • Michael__mai
  • Michael__mai
  • 2015年12月12日 10:27
  • 1960
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi中多线程用Synchronize实现VCL数据同步显示 解决在线程中操作控件出现问题
举报原因:
原因补充:

(最多只允许输入30个字)