首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 多執行緒排序 (TThread) 讓介面保持回應

     編輯:Delphi

背景

大量資料排序 (如氣泡排序) 會阻塞主執行緒,導致介面凍結。利用 TThread 將排序移至背景執行緒,主執行緒可持續處理使用者操作。

排序執行緒類別 (mysort.pas)


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 可支援取消操作。
  • 若排序完成需更新 UI,必須使用 Synchronize 或佇列訊息,不可直接在執行緒中操作 VCL 控件。

適用場景

大量資料匯入/匯出、複雜運算、影像處理、資料庫批次更新等長時間任務,配合進度條回報進度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved