Delphi多匿名线程运行时,线程没有运行完一直挂着,是不是操作同一全局变量的问题

sum008 2019-11-06 11:59:58
Delphi多匿名线程运行时,线程没有运行完一直挂着,是不是操作同一全局变量的问题,线程可提前释放吗,用fee线程还在执行,如果是操作同一变量怎么处理 测试时一直Begin 没有后面的End输出 D10.2 Android下
...全文
366 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你的匿名线程中的主要工作还是在主线程中做的(TThread.Synchronize(...)),所以你的多线程不具有实际意义。另外,如果多线程都访问了数据模块中的同样组件,比如数据库组件,就会导致异常
sum008 2019-11-06
  • 打赏
  • 举报
回复
没有什么逻辑的.就提示一个查询
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;
  • 打赏
  • 举报
回复
估计是代码逻辑不正确导致的死锁

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧