Event OnWriteRegisters fires up in separate (not main) thread so update of string grid (sgdRegisters) should not be processed here.
procedure TfrmMain.msrPLCWriteRegisters(const Sender: TIdContext;
const RegNr, Count: Integer; const Data: TModRegisterData;
const RequestBuffer: TModBusRequestBuffer);
var
i: Integer;
begin
for i := 0 to (Count - 1) do
SetRegisterValue(RegNr + i, Data[i]); // problem: call of VCL method in background thread
end;
procedure TfrmMain.SetRegisterValue(const RegNo: Integer; const Value: Word);
...
begin
...
sgdRegisters.Cells[1, Index + 1] := IntToStr(Value); // VCL is not threadsafe
...
end;
Event OnWriteRegisters fires up in separate (not main) thread so update of string grid (sgdRegisters) should not be processed here.
procedure TfrmMain.msrPLCWriteRegisters(const Sender: TIdContext; const RegNr, Count: Integer; const Data: TModRegisterData; const RequestBuffer: TModBusRequestBuffer); var i: Integer; begin for i := 0 to (Count - 1) do SetRegisterValue(RegNr + i, Data[i]); // problem: call of VCL method in background thread end;
procedure TfrmMain.SetRegisterValue(const RegNo: Integer; const Value: Word); ... begin ... sgdRegisters.Cells[1, Index + 1] := IntToStr(Value); // VCL is not threadsafe ... end;