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

Delphi IdTCP 組件死鎖問題分析與解決方案

     編輯:Delphi

IdTCPServer OnConnect 事件中顯示窗體導致死鎖的原因與三種解決辦法

在 IdTCPServer.OnConnect 事件(執行於工作線程)中直接調用 Form.Show 會導致死鎖,原因是 VCL 不支援多線程直接操作 UI,且窗體創建/顯示涉及消息泵與鎖競爭。

問題重現

procedure TServerForm.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
  Form2.Show;  {死鎖!Form2 含 Button/ListBox 等控件時必現}
end;

方案一:Timer 延遲執行(早期權宜之計)

procedure TServerForm.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
  Timer1.Enabled := True;  {Interval=1}
end;

procedure TServerForm.Timer1Timer(Sender: TObject);
begin
  Form2.Show;
  Timer1.Enabled := False;
end;

利用 Timer 事件回到主線程執行,但屬於「大腦短路」式修補。

方案二:Synchronize 正規同步(推薦)

procedure TServerForm.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
  AThread.Synchronize(Form2.Show);  {正確:在主線程執行匿名方法}
end;

TIdPeerThread.Synchronize 將方法排隊到主線程執行,是 Indy 線程安全操作 UI 的標準方式。

核心原則

  • 所有 UI 操作必須在主線程執行
  • Indy 線程事件中使用 Synchronize 或 TThread.Queue
  • 避免在工作線程直接創建/顯示/銷毀窗體或控件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved