Wthread
Simple multithreading for delphi/lazarus
Install / Use
/learn @wadman/WthreadREADME
wthread
Component for work with a thread, Delphi&Lazarus (win&wince&*nix) (c) wadman 2016-2021, from 10.08.2021
This is my component to work with additional threads for Delphi & Lazarus. Using them is very easy. Drop a TWCThread on the form and add a few tasks. In the task you need to write a method OnExecute which will be executed in a different thread. Each task is a message flow. All tasks will run in the start order.
It is not recommended to use the call to LCL/VCL from the OnExecute method. Instead, use the Sender.PostMessage and the OnMessage task handler. Check the Terminated flag as often as possible in the OnExecute method. This means that the thread handler is waiting for the work to stop. Perhaps the application is already at the closing stage and the user expects it.
Enjoy.
Components tested on Ubuntu 14 and 16 LTS, Windows 7, 8, 10, WinCE, Lazarus 1.6/1.7/1.8/1.9/2.0/2.1/2.2, Delphi 7/XE2/10.
Example project:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, wcthread, StdCtrls;
const
WM_MY_MESSAGE = 1;
type
TForm1 = class(TForm)
WCThread1: TWCThread;
TaskCheckLicense: TTask;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure TaskCheckLicenseExecute(const Sender: TTask; const Msg: Word; var Param: Variant);
procedure TaskCheckLicenseMessage(const Sender: TTask; const Msg: Word; const Param: Variant);
procedure TaskCheckLicenseFinish(const Sender: TTask; const Msg: Word; const Param: Variant);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
// Running a task in another thread
TaskCheckLicense.Start(5000); // see TaskCheckLicenseExecute(... Param)
end;
procedure TForm1.TaskCheckLicenseExecute(const Sender: TTask; const Msg: Word; var Param: Variant);
begin
// Check license, its another thread. Here it is forbidden to refer to the VCL/LCL
Sender.PostMessage(WM_MY_MESSAGE, 'Checking license...'); // post message for logging to the main thread
Sender.WaitMs(Param); // wait some secs for the hard work
Param := 'License is valid.'; // Input and output parameter. It is transferred from Start and returns to Finish.
end;
procedure TForm1.TaskCheckLicenseMessage(const Sender: TTask; const Msg: Word; const Param: Variant);
begin
// The main thread. Here we are processing messages from the additional thread
case Msg of
WM_MY_MESSAGE: begin
Label1.Caption := Param;
end;
end;
end;
procedure TForm1.TaskCheckLicenseFinish(const Sender: TTask; const Msg: Word; const Param: Variant);
begin
// Main thread. Task done.
Label1.Caption := Param;
end;
end.
Related Skills
node-connect
348.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
109.1kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
348.5kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
348.5kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
