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

Delphi 多線程程序示例:CreateThread 與主線程阻塞對比

     編輯:Delphi

多線程基礎:使用 CreateThread 避免 UI 凍結的完整對比示例

展示在 IdTCPServer.OnConnect 等工作線程中直接操作 UI 導致死鎖,以及正確使用 CreateThread / Synchronize 保持界面響應的對比。

完整代碼

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;
type
  TForm1 = class(TForm)
    UsedThread: TBitBtn;
    NoUsedThread: TBitBtn;
    procedure UsedThreadClick(Sender: TObject);
    procedure NoUsedThreadClick(Sender: TObject);
  end;
var Form1: TForm1;
implementation {$R *.dfm}

function MyThreadFunc(P: Pointer): Longint; stdcall;
var i: Longint; DC: HDC; S: string;
begin
  DC := GetDC(Form1.Handle);
  for i := 0 to 500000 do begin
    S := IntToStr(i);
    TextOut(DC, 10, 10, PChar(S), Length(S));
  end;
  ReleaseDC(Form1.Handle, DC);
  Result := 0;
end;

procedure TForm1.UsedThreadClick(Sender: TObject);
var hThread: THandle; ThreadID: DWORD;
begin
  hThread := CreateThread(nil, 0, @MyThreadFunc, nil, 0, ThreadID);
  if hThread = 0 then MessageBox(Handle, 'Didn''t Create a Thread', nil, MB_OK);
end;

procedure TForm1.NoUsedThreadClick(Sender: TObject);
begin
  MyThreadFunc(nil);  {主線程直接執行,UI 完全凍結直到循環結束}
end;
end.

現象對比

  • UsedThread:創建線程執行繪制,主線程空閒,可拖動/縮放窗體、點擊其他按鈕
  • NoUsedThread:主線程直接執行 50 萬次循環,界面完全無響應,標題欄顯示「未響應」

現代最佳實踐

推薦使用 TThread 類或 TTask.Run (PPL) 替代底層 CreateThread,自動處理異常、同步、線程池復用。

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