Science, Tech, Math › Computer Science Synchronizing Threads and GUI in a Delphi Application Sample Code for a GUI Delphi Application With Multiple Threads Share Flipboard Email Print Synchronizing Threads and GUI. Computer Science Delphi Programming Delphi Tutorials Advanced PHP Programming Perl Python Java Programming Javascript Programming C & C++ Programming Ruby Programming Visual Basic View More By Zarko Gajic Zarko Gajic Twitter Computer Science Expert MSCS, Computer Science, University of Osijek Zarko Gajic is experienced in SQL and has working knowledge of DB systems such as MS SQL Server, Firebird, Interbase, and Oracle. He is also proficient in XML, DHTML, and JavaScript. Learn about our Editorial Process Updated on January 28, 2019 Multi-threading in Delphi lets you create applications that include several simultaneous paths of execution. 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. 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. 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. Thanks to Jens Borrisholt for submitting this code sample. Cite this Article Format mla apa chicago Your Citation Gajic, Zarko. "Synchronizing Threads and GUI in a Delphi Application." ThoughtCo, Aug. 25, 2020, thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159. Gajic, Zarko. (2020, August 25). Synchronizing Threads and GUI in a Delphi Application. Retrieved from https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 Gajic, Zarko. "Synchronizing Threads and GUI in a Delphi Application." ThoughtCo. https://www.thoughtco.com/synchronizing-threads-and-gui-delphi-application-1058159 (accessed June 9, 2023). copy citation