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

Delphi多线程同步过程Synchronize的一些说明 windows原生应用程序开发中,经常伴随多线程的使用,多线程开发很简单,难点就是在于线程的同步,在Delphi中提供了VC中不具备的一个过程Synchronize,使用起来非常方便,解决了很多VC开发中碰到的常见问题,但是在看了很多Delphi代码后,发现很多人对于Synchronize的理解还是有问题的,不能很好地正确使用Synchronize过程,本文对Synchronize过程的使用提出 阅读详情
Delphi中多线程用Synchronize实现VCL数据同步显示
Lanno Ckeeke 
2006-5-12
概述:
       VCL实现同步的另一种方法就是调用线程类的Synchronize的过程,此过程需要一个无参数的procedure,故在此procedure中无法传递参数值,但可以通过类的成员来实现。在类的Execute中只须调用Synchronize就可以了。
实现:
       关键在于对Synchronize参数的定义。定义一个无参数的procedure通过它来访问类的成员变量szName和nIndex。在类的重载Execute中调用Synchronize。
子类的定义如下:
  1. unit TChildThread;
  2.  
  3. interface
  4.  
  5. uses
  6.  Classes,Messages,Windows,SysUtils;
  7.  
  8. const MAX_LEN = 260;
  9. type
  10.  TChildThreads = class(TThread)
  11.  private
  12.     { Private declarations }
  13.  protected
  14. procedure Execute; override;
  15. //同步函数的声明
  16.     procedure UpdateData;
  17.  public
  18.      szName : array[0..MAX_LEN] of Char;
  19.     nIndex : Integer;
  20.  end;
  21.  
  22. implementation
  23. uses
  24.        Unit1;
  25.  
  26. { Important: Methods and properties of objects in VCL or CLX can only be used
  27.  in a method called using Synchronize, for example,
  28.  
  29.       Synchronize(UpdateCaption);
  30.  
  31.  and UpdateCaption could look like,
  32.  
  33.     procedure TChildThread.UpdateCaption;
  34.     begin
  35.       Form1.Caption := 'Updated in a thread';
  36.     end; }
  37.  
  38. { TChildThread }
  39. //同步函数的实现
  40. procedure TChildThreads.UpdateData;
  41. begin
  42.        Form1.ShowData.Items.Add(PChar(@szName));
  43. end;
  44.  
  45. procedure TChildThreads.Execute;
  46. begin
  47.  { Place thread code here }
  48.  //调用同步过程
  49.  Synchronize(UpdateData);
  50. end;
  51.  
  52. end.

主程的设计与《Delphi中多线程用消息实现VCL数据同步显示》基本一致,但为了与其显示相同结果,在生成子线程中语句顺序作了一下调整。以下代码仅显示与上一篇不同的一个过程,其它代码不再赘述。
  1. procedure TForm1.StartThreadsClick(Sender: TObject);
  2. var
  3.        oChildThread : array[0..1000of TChildThreads;
  4.  i : Integer;
  5. begin
  6.        For i := 0 to 1000 do
  7.  begin
  8.      oChildThread[i] := TChildThreads.Create(true);
  9.     //注意这里的代码与消息同步中的顺序。
  10.     oChildThread[i].nIndex := i;
  11.     strcopy(@oChildThread[i].szName,PChar('Child' + IntToStr(i)));
  12.     oChildThread[i].Resume;
  13.  end;
  14.  
  15. end;

深入解析Android Qcom Camera HAL3架构与Camx线程模块 本文深入解析了Android Qcom Camera HAL3架构与Camx线程模块的核心原理。文章以高通芯片平台为例,剖析了从按下快门到生成照片的完整Camera流程分析,重点阐述了Camx框架中线程池、消息队列及Fence同步机制如何协同工作,以实现高效、稳定的多线程并发图像处理,为相机性能优化提供理论基础。 阅读详情

相关推荐

Nvidia Jetson 编解码开发(3)解决H265解码报错“PPS id out of range”

基于之前的开发程序通过Jetson Xavier NX 硬编码的H265发出后,上位机断点播放发出来的H265码流,会报“PPS id out of range” 错误。

jzwjzw19900922的博客 3769

delphi多线程传递参数及同步二

本代码介绍了如何给线程传递参数,以及用参数在主线程中显示数据

delphi vcl线程同步synchronize

delphi vcl线程同步synchronize

JAVA多线程(八)——Callable,FutureTask以及CompletableFuture简介

个人学习笔记之——FutureCallaleFutureTask简介get方法awaitDone方法cancel方法run方法FutureTask使用样例CompletableFuture简介 Callale 对于Callable大家应该都很熟悉,它与Runnable属于线程的顶级接口,不过它与Runnale不同的是,它支持线程返回执行结果,下面是它的使用方法: package com.example.demo.thread; import java.util.concurrent.*; /** *

孙志南的博客 893

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

看本文时,可以同时参考:Delphi中线程类 TThread实现多线程编程(事件、临界区、Synchronize、WaitFor……) 先说一下RTL和VCL   RTL(Run-Time library),运行时库,包括System、SysUtils、Math三个单元,提供的函数与语言、编译器、操作系统及进程有关   RTL提供类之间继承于 TObject 和 RTL内部的类   ...

weixin_30512043的博客 733

delphi】线程终的Synchronize和Queue的区别

我们经常在做程序开发的时候会使用到线程,但是线程如果需要操作UI界面元素,则需要使用到Queue和Synchronize方法,这两个方法都会安全的在主线程中执行任务,但是她们的区别是什么呢?

sensor_WU 博客 876

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

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

zhengbo2006的专栏 2609

Delphi多线程Synchronize的运用

Delphi多线程Synchronize实现VCL数据同步显示,Delphi多线程Synchronize实现VCL数据同步显示转自:http://blog.csdn.net/maxcode/archive/2006/05/12/726766.aspx概述:        VCL实现同步的另一种方法就是调用线程类的Synchronize的过程,此过程需要一个无参数的procedure,故

三岔路口,每一条路都有自己的精彩...... 1万+

delphiSynchronize

<br />delphiSynchronize这个东东有什么用?我知道是线程同步使用的<br />是否是一个函数或变量,当一个线程在使用时,如果这个函数使用了Synchronize修钸的话就不允许别一个线程来调用这个函数 <br /> <br />1楼:别的线程会等待该操作完成后才能继续 <br />2楼:你说的基本是这个意思。它的目的是避免多个子线程同时访问主线程资源。 <br />示例: <br />procedure ServerThread.ListItemEnd; //子线程的一个方法 <br

互联网产品管理、交互、设计、开发、用户体验专栏 7732

delphi 线程同步的基本方法

上次跟大家分享了线程的标准代码,其实在线程的使用中最重要的是线程的同步问题,如果你在使用线程后,发现你的界面经常被卡死,或者无法显示出来,显示混乱,你的使用的变量值老是不按预想的变化,结果往往出乎意料,那么你很有可能是忽略了线程同步的问题。 当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源。例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件中的字符

chinajobs的专栏 2243

Delphi】 Thread.Queue与Synchronize的区别

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33835690的博客 573

Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……

  接着上文介绍TThread。   现在开始说明 Synchronize和WaitFor   但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event)   事件(Event)与Delphi中的事件有所不同。从本质上讲,Event其实就相当于一个全局的布尔变量。它有两个赋值操作:Set和ReSet,相当于把它设置为 True或False。而检查它的值是通过...

weixin_30809173的博客 635

Delphi 线程中同步不卡死

Delphi DLL与主界面数据同步不卡死之方法

chingming135的博客 614

Delphi】 Thread.Queue与Synchronize的区别

Thread.Queue与Synchronize的区别

wingleo的专栏 3778

Synchronize函数

错误在于:Synchronize(PushTheButton); Synchronize应该是TThread的一个方法吧,在TFormPluginClient.UsedThreadClick直接这样使用是不行的。这里的Synchronize表示的是Windows单元的常量

期待下集是个可爱梦儿 709

土豆切片机设计.rar

土豆切片机设计.rar

上一篇: Delphi中多线程用消息实现VCL数据同步显示
下一篇: ZSChatServer线程设计模型
maxcode
博客等级 码龄23年 15粉丝 62原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值