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}
對於涉及VCL的線程,是必須在主線程中的,在DELPHI中使用線程,你只需要記住兩句:
1、線程不安全,2、VCL相關要放到主線程。
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; //以上建庫完畢 ,下面開始創建表和字段