Download as pdf or txt
Download as pdf or txt
You are on page 1of 13

17/10/2019 Synchronizing Threads and GUI in a Delphi application

Science, Tech, Math › Computer Science

Synchronizing Threads and GUI in a Delphi


Application
Sample Code for a GUI Delphi Application With Multiple Threads

SHARE FLIP EMAIL

Synchronizing Threads and GUI.

by Zarko Gajic
Updated January 28, 2019

https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 1/13
17/10/2019 Synchronizing Threads and GUI in a Delphi application

Multi-threading in Delphi lets you create applications that include several simultaneous
paths of execution.

https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 2/13
17/10/2019 Synchronizing Threads and GUI in a Delphi application

A normal Delphi application is single-threaded, which means all VCL objects access their
properties and execute their methods within this single thread. To speed up data processing
in your application, include one or more secondary threads.

Processor Threads

A thread is a communication channel from an application to a processor. Single-


threaded programs need communication to flow in both directions (to and from the
processor) as it executes; multi-threaded apps can open several different channels,
thus speeding up execution.

Threads & GUI


When several threads are running in the application, the question arises of how you can
update your graphical user interface as a result of a thread execution. The answer lies in the
TThread class Synchronize method.

Advertisement

https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 3/13
17/10/2019 Synchronizing Threads and GUI in a Delphi application

To update your application's user interface, or main thread, from a secondary thread, you
need to call the Synchronize method. This technique is a thread-safe method that avoids
multi-threading conflicts that can arise from accessing object properties or methods that are
not thread-safe, or using resources not in the main thread of execution.

Below is an example demo that uses several buttons with progress bars, each progress bar
displaying the current "state" of the thread execution.

https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 4/13
17/10/2019 Synchronizing Threads and GUI in a Delphi application

unit MainU;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls;
type
//interceptor class
TButton = class(StdCtrls.TButton)
OwnedThread: TThread;
ProgressBar: TProgressBar;
end;
TMyThread = class(TThread)
private
FCounter: Integer;
FCountTo: Integer;
FProgressBar: TProgressBar;
FOwnerButton: TButton;
procedure DoProgress;
procedure SetCountTo(const Value: Integer) ;
procedure SetProgressBar(const Value: TProgressBar) ;
procedure SetOwnerButton(const Value: TButton) ;
protected
procedure Execute; override;
public

https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 5/13
17/10/2019 Synchronizing Threads and GUI in a Delphi application

constructor 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;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
{ TMyThread }
constructor TMyThread.Create(CreateSuspended: Boolean) ;
begin
inherited;
FCounter := 0;
FCountTo := MAXINT;
end;
procedure TMyThread.DoProgress;
var
PctDone: Extended;
begin
PctDone := (FCounter / FCountTo) ;
FProgressBar.Position := Round(FProgressBar.Step * PctDone) ;
FOwnerButton.Caption := FormatFloat('0.00 %', PctDone * 100) ;
end;
procedure TMyThread.Execute;
const
https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 6/13
17/10/2019 Synchronizing Threads and GUI in a Delphi application

Interval = 1000000;
begin
FreeOnTerminate := True;
FProgressBar.Max := FCountTo div Interval;
FProgressBar.Step := FProgressBar.Max;
while FCounter < FCountTo do
begin
if 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) ;
begin
FCountTo := Value;
end;
procedure TMyThread.SetOwnerButton(const Value: TButton) ;
begin
FOwnerButton := Value;
end;
procedure TMyThread.SetProgressBar(const Value: TProgressBar) ;
begin
FProgressBar := Value;
end;
procedure TMainForm.Button1Click(Sender: TObject) ;
var
aButton: TButton;
aThread: TMyThread;
aProgressBar: TProgressBar;
begin
aButton := TButton(Sender) ;
if not Assigned(aButton.OwnedThread) then
Advertisement
begin
aThread := TMyThread.Create(True) ;
aButton.OwnedThread := aThread;
aProgressBar := TProgressBar(FindComponent(StringReplace(aButton.Name,
'Button', 'ProgressBar', []))) ;
aThread.ProgressBar := aProgressBar;
https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 7/13
17/10/2019 Synchronizing Threads and GUI in a Delphi application

aThread.OwnerButton := aButton;
aThread.Resume;
aButton.Caption := 'Pause';
end
else
begin
if aButton.OwnedThread.Suspended then
aButton.OwnedThread.Resume
else
aButton.OwnedThread.Suspend;
aButton.Caption := 'Run';
end;
end;
end.

Advertisement

Ad
Ad

Advertisement

Delphi Team
Delphi Team
Ad closed by Sie suchen eine Firma zur Betreuung
Ihrer Delphi/SQL Anwendung?
Sie suchen eine Firma zur Betreuung
Stop seeing this
Ihrer Delphi/SQL Anwendung? ad

Why this ad? Zur Website


Zur Website

https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 8/13
17/10/2019 Synchronizing Threads and GUI in a Delphi application

Thanks to Jens Borrisholt for submitting this code sample.

CITE
Continue Reading

Article Article
Delphi Thread Pool Example Using Creating a Delphi Notepad: Open
AsyncCalls and Save

Article Article
Multithreaded Delphi Database How to Dynamically Add Items to a
Queries With dbGo (ADO) TPopUp Delphi Menu

https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 9/13
17/10/2019 Synchronizing Threads and GUI in a Delphi application

Article
Multi-Threading in C# Using the
Task Parallel Library in .NET 4.0

Article
How to De ne and Implement
Interfaces in Delphi

Article
Article Delphi Resource Files Made Easy
How to Show a Login Before the
Main Form in Delphi

Article
Working with GIF images in Delphi

https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 10/13
17/10/2019 Synchronizing Threads and GUI in a Delphi application

Close up of a programmer working on Close up of pen and checkbox sign,


a laptop with a monitor mounted behind. studio shot

Article
Use the Right Coding to Display Article
Menu Item Hints in Delphi How to Place a Checkbox Into a
Delphi DBGrid

Article
How to Place a TProgressBar Into a
TStatusBar in Delphi

Article
Using a Function as a Parameter in
Another Function Article
How to Implement OnCreate Event
for Delphi TFrame Object

Article
How to Run Delphi Applications
With Parameters

https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 11/13
17/10/2019 Synchronizing Threads and GUI in a Delphi application

Article
Learn How to Con gure and Edit
.INI Files in Delphi

Learn Something New Every Day

Enter Your Email SIGN UP

Follow Us

TRUSTe

Science, Tech, Math Humanities


https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 12/13
17/10/2019 Synchronizing Threads and GUI in a Delphi application

Languages Resources

About Us Advertise

Privacy Policy Cookie Policy

Careers Editorial Guidelines

Contact Terms of Use

ThoughtCo is part of the Dotdash publishing family.


Verywell Family | Verywell Mind | The Balance
Lifewire and more

https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 13/13

You might also like