Delphi多匿名執行緒運行時,執行緒沒有運行完一直掛著,是不是操作同一全域變數的問題,執行緒可提前釋放嗎,用fee執行緒還在執行,如果是操作同一變數怎么處理
測驗時一直Begin
沒有后面的End輸出
D10.2 Android下
uj5u.com熱心網友回復:
估計是代碼邏輯不正確導致的死鎖uj5u.com熱心網友回復:
沒有什么邏輯的.就提示一個查詢procedure TWorkPLCHandlers.UpdateMachCommSta(IsLog: Boolean); //更新通信狀態
begin
if IsLog then
AddMemoLog('UpdateMachCommSta:Begin '+BoolToStr(IsUptCommSta)+' IsConn:'+ BoolToStr(DMSYS.NTConn_SYS.IsConnected));
if IsUptCommSta then Exit; //與服務器未連接或者更新中 (not IsLineConn) Or
IsUptCommSta := True;
try
TThread.CreateAnonymousThread( // 創建一個單執行緒,完成ATask
procedure
begin
try
{TThread.Synchronize(nil,
procedure
begin }
try
With DMSYS.NTDataSet_CommSta do
begin
Close;SQL.Clear;
SQL.Add('Update OLM_MachineLst_Sta Set CommState='+QuotedStr(CommState)+', CommDT=GetDate() ');
SQL.Add(' Where MachineID='+IntToStr(MachineID));
ExecSQL;
end;
IsUptCommSta := False;
except
on e:Exception do
begin
IsUptCommSta := False;
AddMemoLog('UpdateMachCommSta:1錯誤'+e.Message+' IsUpt:'+BoolToStr(IsUptCommSta));
end;
end;
if IsLog then
AddMemoLog('UpdateMachCommSta:End '+BoolToStr(IsUptCommSta));
// end)
except
on e:Exception do
begin
IsUptCommSta := False;
AddMemoLog('UpdateMachCommSta:2錯誤'+e.Message+' IsUpt:'+BoolToStr(IsUptCommSta));
end;
end;
IsUptCommSta := False;
end).Start;
except
on e:Exception do
begin
IsUptCommSta := False;
AddMemoLog('UpdateMachCommSta:3錯誤'+e.Message+' IsUpt:'+BoolToStr(IsUptCommSta));
end;
end;
end;
uj5u.com熱心網友回復:
你的匿名執行緒中的主要作業還是在主執行緒中做的(TThread.Synchronize(...)),所以你的多執行緒不具有實際意義。另外,如果多執行緒都訪問了資料模塊中的同樣組件,比如資料庫組件,就會導致例外轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/19212.html
標籤:VCL組件開發及應用
上一篇:Delphi語法求幫助
