Delphi多匿名线程运行时,线程没有运行完一直挂着,是不是操作同一全局变量的问题,线程可提前释放吗,用fee线程还在执行,如果是操作同一变量怎么处理
测试时一直Begin
没有后面的End输出
D10.2 Android下

解决方案 »

  1.   

    没有什么逻辑的.就提示一个查询
    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;
      

  2.   

    你的匿名线程中的主要工作还是在主线程中做的(TThread.Synchronize(...)),所以你的多线程不具有实际意义。另外,如果多线程都访问了数据模块中的同样组件,比如数据库组件,就会导致异常