[Properties (by Name)] [Methods (by Name)]
Runs a method or a global function in a separate thread, so that a long operation does not block the application while it runs
Source position: msethread.pas line 42
type tmsethread = class |
public |
constructor create(); |
destructor destroy; override; |
procedure afterconstruction; override; |
function waitfor; virtual; |
procedure terminate; virtual; |
procedure kill; |
property running: Boolean; [r] |
property terminated: Boolean; [r] |
property id: threadty; [r] |
property freeonterminate: Boolean; [rw] |
end; |
|
Runs a method or a global function in a separate thread, so that a long operation does not block the application while it runs |
|
| | | ||
TObject |
Runs a method or a global function in a separate thread, so that a long operation does not block the application while it runs. The following example starts a three second simulated operation in a thread while a paint box blinks to show that the user interface stays responsive, and properly terminates the thread when the form is destroyed.
uses main_mfm; { ttestthreadcontainer } destructor ttestthreadcontainer.Destroy; begin if FThread <> nil then begin FThread.Terminate; application.WaitForThread(FThread); FThread.Destroy; end; inherited; end; procedure ttestthreadcontainer.Run; begin FThread := tmsethread.Create(@Execute); end; function ttestthreadcontainer.Execute(thread: tmsethread): integer; begin Sleep(3000); mainfo.tmWait.Enabled := FALSE; ShowMessage('Operation completed.'); result := 0; end; { tmainfo } procedure tmainfo.ButtonExecute(const sender: TObject); begin tmWait.Enabled := TRUE; FThreadContainer.Run; end; procedure tmainfo.FormCreate(const sender: TObject); begin FThreadContainer := ttestthreadcontainer.Create(); FBlink := FALSE; end; procedure tmainfo.TimerExecute(const sender: TObject); begin pbWait.Invalidate; FBlink := not FBlink; end; procedure tmainfo.PaintBoxPaint(const sender: twidget; const acanvas: tcanvas); begin if FBlink then acanvas.FillRect(MakeRect(0, 0, sender.bounds_cx, sender.bounds_cy), CL_BLUE); end; procedure tmainfo.FormDestroy(const sender: TObject); begin FThreadContainer.Free; end;