在delphi应用程序中同步线程和gui

Delphi中的多线程允许您创建包含多个同时执行路径的应用程序。...

Delphi中的多线程允许您创建包含多个同时执行路径的应用程序。

Synchronizing Threads and GUI Synchronizing Threads and GUI

一个普通的Delphi应用程序是单线程的,这意味着所有VCL对象都在这个单线程中访问它们的属性并执行它们的方法。要加快应用程序中的数据处理,请包括一个或多个辅助线程。

处理器线程

线程是从应用程序到处理器的通信通道。单线程程序在执行时需要双向通信(与处理器之间的通信);多线程应用程序可以打开多个不同的通道,从而加快执行速度。

线程及;桂

当应用程序中运行多个线程时,问题是如何在执行线程后更新图形用户界面。答案在于TThread类的Synchronize方法。

要从辅助线程更新应用程序的用户界面或主线程,需要调用Synchronize方法。此技术是一种线程安全的方法,可避免访问对象属性或非线程安全的方法,或使用非执行主线程中的资源时可能出现的多线程冲突。

下面是一个示例演示,它使用几个带有进度条的按钮,每个进度条显示线程执行的当前“状态”。

unit MainU;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ComCtrls, StdCtrls, ExtCtrls;type//interceptor classTButton = class(StdCtrls.TButton)OwnedThread: TThread;ProgressBar: TProgressBar;end;TMyThread = class(TThread)privateFCounter: Integer;FCountTo: Integer;FProgressBar: TProgressBar;FOwnerButton: TButton;procedure DoProgress;procedure SetCountTo(const Value: Integer) ;procedure SetProgressBar(const Value: TProgressBar) ;procedure SetOwnerButton(const Value: TButton) ;protectedprocedure Execute; override;publicconstructor Create(CreateSuspended: Boolean) ;property CountTo: Integer read FCountTo write SetCountTo;property ProgressBar: TProgressBar read FProgressBar write SetProgressBar;property OwnerButton: TButton read FOwnerButton write SetOwnerButton;end;TMainForm = class(TForm)Button1: TButton;ProgressBar1: TProgressBar;Button2: TButton;ProgressBar2: TProgressBar;Button3: TButton;ProgressBar3: TProgressBar;Button4: TButton;ProgressBar4: TProgressBar;Button5: TButton;ProgressBar5: TProgressBar;procedure Button1Click(Sender: TObject) ;end;varMainForm: TMainForm;implementation{$R *.dfm}{ TMyThread }constructor TMyThread.Create(CreateSuspended: Boolean) ;begininherited;FCounter := 0;FCountTo := MAXINT;end;procedure TMyThread.DoProgress;varPctDone: Extended;beginPctDone := (FCounter / FCountTo) ;FProgressBar.Position := Round(FProgressBar.Step * PctDone) ;FOwnerButton.Caption := FormatFloat('0.00 %', PctDone * 100) ;end;procedure TMyThread.Execute;constInterval = 1000000;beginFreeOnTerminate := True;FProgressBar.Max := FCountTo div Interval;FProgressBar.Step := FProgressBar.Max;while FCounter < FCountTo dobeginif FCounter mod Interval = 0 then Synchronize(DoProgress) ;Inc(FCounter) ;end;FOwnerButton.Caption := 'Start';FOwnerButton.OwnedThread := nil;FProgressBar.Position := FProgressBar.Max;end;procedure TMyThread.SetCountTo(const Value: Integer) ;beginFCountTo := Value;end;procedure TMyThread.SetOwnerButton(const Value: TButton) ;beginFOwnerButton := Value;end;procedure TMyThread.SetProgressBar(const Value: TProgressBar) ;beginFProgressBar := Value;end;procedure TMainForm.Button1Click(Sender: TObject) ;varaButton: TButton;aThread: TMyThread;aProgressBar: TProgressBar;beginaButton := TButton(Sender) ;if not Assigned(aButton.OwnedThread) thenbeginaThread := TMyThread.Create(True) ;aButton.OwnedThread := aThread;aProgressBar := TProgressBar(FindComponent(StringReplace(aButton.Name, 'Button', 'ProgressBar', []))) ;aThread.ProgressBar := aProgressBar;aThread.OwnerButton := aButton;aThread.Resume;aButton.Caption := 'Pause';endelsebeginif aButton.OwnedThread.Suspended thenaButton.OwnedThread.ResumeelseaButton.OwnedThread.Suspend;aButton.Caption := 'Run';end;end;end.

感谢Jens Borrisholt提交此代码示例。

  • 发表于 2021-10-13 10:38
  • 阅读 ( 112 )
  • 分类:数学

你可能感兴趣的文章

睡觉(sleep)和在java中等待(wait in java)的区别

...可能访问一个共享资源。它会导致产生错误的输出。线程同步只能用于使一个线程访问共享资源。假设如下情况。如果有两个线程t1和t2,则t1开始将值保存到名为Text1.txt的文本文件中。当t1返回时,这些值将用于其他计算。如果t...

  • 发布于 2020-10-19 03:04
  • 阅读 ( 275 )

将图形用户界面(gui)添加到microsoft robocopy命令行工具

...设置简单或高级备份策略。它提供了多线程复制、镜像或同步模式、自动重试以及恢复复制过程的功能。如果您习惯于使用命令行工具,那么可以使用命令语法和选项在命令行上直接运行robocy。您还可以将Robocopy的命令行参考和...

  • 发布于 2021-04-12 03:49
  • 阅读 ( 135 )

散列表(hashmap)和哈希表(hashtable)的区别

...点的框架实现。集合实现使用synchronized wrapper框架来提供同步的类,否则实现是不同步的。有几个类提供map接口的实现。 Java平台包含三个通用的Map实现:HashMap、TreeMap和LinkedHashMap。HashMap和Hashtable是Java中用于在哈希表中存储键/...

  • 发布于 2021-06-25 20:14
  • 阅读 ( 252 )

awt公司(awt)和java中的swing(swing in java)的区别

...关性和许多其他特性。程序员可以使用Java语言编写各种应用程序,包括桌面、web、移动、图像处理等。它提供了构建丰富图形用户界面(GUI)的工具包。AWT和Swing是其中的两个。 覆盖的关键领域 1.什么是GUI–定义,功能2.什么是...

  • 发布于 2021-07-01 04:03
  • 阅读 ( 227 )

windows内核(windows kernel)和linux内核(linux kernel)的区别

...世界各地都有贡献者。 在Linux系统中,用户程序可以通过应用程序编程接口(API)与内核进行交互。作为内核功能的一部分,设备驱动程序控制硬件。内核和可加载内核模块(LKM)之间有一个接口。 此外,Linux内核存在于个人...

  • 发布于 2021-07-01 06:32
  • 阅读 ( 443 )

数组表(arraylist)和矢量(vector)的区别

ArrayList和Vector的主要区别在于ArrayList是非同步的,它允许多个线程同时在一个ArrayList上工作,而Vector是同步的,并且避免了多个线程同时在一个Vector上工作。 Java等编程语言支持集合,允许将多个对象存储为单个单元。两个这样...

  • 发布于 2021-07-01 09:19
  • 阅读 ( 224 )

同步(synchronous)和java中的异步调用(asynchronous calls in java)的区别

Java中同步调用和异步调用的主要区别在于,在同步调用中,代码执行在继续之前等待事件,而异步调用不会阻止程序执行代码。 程序员可以将回调函数作为参数传递给另一个函数。它是在事件之后执行的。当我们需要在点击按...

  • 发布于 2021-07-01 14:57
  • 阅读 ( 833 )

处理程序(handler)和线(thread)的区别

...生时,执行一组任务。此外,它是来自GUI工具箱等框架的应用程序级信息。一些常见的GUI事件包括按键、鼠标更改、计时器操作和动作选择。此外,事件驱动编程高度依赖于事件处理程序。事件调度处理框架中创建的事件。它管...

  • 发布于 2021-07-01 17:30
  • 阅读 ( 254 )

图形用户界面,ide(gui, ide)和用户界面(ui)的区别

...人类可能与之交互的设备中,例如显示器、鼠标和键盘、应用程序甚至网站。事实上,即使是一个可以通过轻按开关打开然后自动关闭的盒子,也有一个用户界面,允许我们打开它。用户界面是允许用户与设备或计算机通信的任...

  • 发布于 2021-07-12 13:48
  • 阅读 ( 319 )

散列表(hashmap)和哈希表(hashtable)的区别

...器用于迭代键 枚举接口用于迭代键 应用 适用于非线程应用程序 通常,对于多线程应用程序是安全的 序列化 未序列化 序列化的 备选方案 可以在多线程环境中使用并发hashMap 别无选择

  • 发布于 2021-07-13 20:48
  • 阅读 ( 317 )
2t1gszoldm1rw2
2t1gszoldm1rw2

0 篇文章

相关推荐