大量資料排序 (如氣泡排序) 會阻塞主執行緒,導致介面凍結。利用 TThread 將排序移至背景執行緒,主執行緒可持續處理使用者操作。
unit mysort;
interface
uses Classes;
type
PSortArray = ^TSortArray;
TSortArray = array[0..MaxInt div SizeOf(Integer) - 1] of Integer;
TSortThread = class(TThread)
private
FSortArray: PSortArray;
FSize: Integer;
protected
procedure Execute; override;
procedure Sort(var A: array of Integer);
public
constructor Create(var SortArray: array of Integer);
end;
implementation
constructor TSortThread.Create(var SortArray: array of Integer);
begin
FSortArray := @SortArray;
FSize := High(SortArray) - Low(SortArray) + 1;
FreeOnTerminate := True;
inherited Create(False); // 立即啟動
end;
procedure TSortThread.Execute;
begin
Sort(Slice(FSortArray^, FSize));
end;
procedure TSortThread.Sort(var A: array of Integer);
var I, J, T: Integer;
begin
for I := High(A) downto Low(A) do
for J := Low(A) to High(A) - 1 do
if A[J] > A[J+1] then
begin
T := A[J]; A[J] := A[J+1]; A[J+1] := T;
if Terminated then Exit; // 支援外部終止
end;
end;
end.
uses mysort;
procedure TForm1.StartSort;
var Arr: array of Integer;
begin
SetLength(Arr, 10000);
// ... 填入資料 ...
TSortThread.Create(Arr); // 建立即啟動,排序在背景進行
// 主介面此處可繼續回應使用者
end;
FreeOnTerminate := True:執行緒結束自動釋放物件。Slice 將指標/長度轉為開放陣列傳給 Sort。Terminated 可支援取消操作。Synchronize 或佇列訊息,不可直接在執行緒中操作 VCL 控件。大量資料匯入/匯出、複雜運算、影像處理、資料庫批次更新等長時間任務,配合進度條回報進度。