程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi主線程重入而導致程序卡死的解決方案,delphi線程

Delphi主線程重入而導致程序卡死的解決方案,delphi線程

編輯:Delphi

Delphi主線程重入而導致程序卡死的解決方案,delphi線程


Delphi的線程可以通過調用AThread.Synchronize(AProc),可以將Proc放入主線程中同步運行,此時AThread將掛起,直到主線程執行完AProc。

如果有BThread,調用了BThread.Synchronize(BProc),而BProc中釋放了AThread

procedure TBThread.BProc
begin
  AThread.Terminate;
  AThread.WaitFor;
  AThread.Free;
end;

此時我們的程序將會卡死,下面的代碼可以避免死鎖,是通用的線程等待結束代碼。

 

    AThread.Terminate;
    while not AThread.Finished do
    begin
      if GetCurrentThreadID = MainThreadID then  //由於是通過Synchronize同步到主線程執行,所以調用CheckSynchronize,防止死鎖
        CheckSynchronize(0);

      Sleep(1);
    end;
    FreeAndNil(AThread);

 如果以前沒注意此重入問題,請修改你的代碼吧。因為不能保證我們的代碼被其他人用時不會出現重入。

此代碼既支持Windows,也支持Android

不過包含的單元不一樣:

uses System.SyncObjs,
{$ifdef MSWINDOWS}
Windows;
{$endif}
{$ifdef POSIX}
Posix.Pthread;
{$endif}

 


Delphi多線程訪問控件時,主線程可以順利訪問,副線程訪問時就卡死 解釋

對於涉及VCL的線程,是必須在主線程中的,在DELPHI中使用線程,你只需要記住兩句:
1、線程不安全,2、VCL相關要放到主線程。
 

delphi 用線程顯示主線程窗口然後掛起自己就會假死怎解決?

var MyAccess: TAccessApplication;//要加入access FileName: WideString; //************************ var ADOConnection:TADOConnection; //這個語句一定要加入adoconnection控件 ,或者要加入uses adodb; ADOQuery:TADOQuery; temppath:string;//存放臨時目錄 tb:boolean;//檢查文件是否存在 begin try //首先判斷是否有這個數據庫 tb:= fileexists(edit1.Text ); if tb then exit; //如果數據庫存在就退出 MyAccess := TAccessApplication.Create(Self); // myaccess.CloseCurrentDatabase ;//close database engin FileName := edit1.Text ; //如果路徑不存在,程序不會自動創建 MyAccess.NewCurrentDatabase(FileName); myaccess.CloseCurrentDatabase; MyAccess.Disconnect; MyAccess.Free; //以上建庫完畢 ,下面開始創建表和字段
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved