gpt4 book ai didi

multithreading - 如何从Parallel.For循环线程写访问字符串变量?

转载 作者:行者123 更新时间:2023-12-03 18:30:14 31 4
gpt4 key购买 nike

System.Threading.TParallel.For循环中,我需要写访问在TParallel.For循环线程之外声明的字符串变量:

// Main thread:
procedure TForm2.GetWeather;
var
CurrentWeather: string;
begin
CurrentWeather := 'Current weather: ';

System.Threading.TParallel.For(1, 10,
procedure(idx: Integer)
begin
if IsRainy(idx) then
begin
// loop thread needs to write-access a mainthread-string-variable:
CurrentWeather := CurrentWeather + 'bad weather, ';
end;
end);

Self.Caption := CurrentWeather;
end;

但是根据文档,不应该这样做。而且 System.SyncObjs.TInterlocked似乎没有写字符串变量的方法。

那么,在这种情况下,我该如何写入CurrentWeather变量?

德尔福10.1.2柏林

编辑:

遵循David Heffernan的建议,我重新编写了代码-这正确吗?:
// Main thread:
procedure TForm2.GetWeather;
var
CurrentWeather: string;
ALock: TCriticalSection;
begin
CurrentWeather := 'Current weather: ';

ALock := TCriticalSection.Create;
try
System.Threading.TParallel.For(1, 10,
procedure(idx: Integer)
begin
if IsRainy(idx) then
begin
ALock.Enter;
try
CurrentWeather := CurrentWeather + 'bad weather, ';
finally
ALock.Leave;
end;
end;
end);
finally
ALock.Free;
end;

Self.Caption := CurrentWeather;
end;

最佳答案

您需要使用锁来修改复杂数据类型,例如string。这不能原子地完成。

如果仅针对Windows,则使用TCriticalSection。对于针对其他平台的代码,则应使用TMonitor

关于multithreading - 如何从Parallel.For循环线程写访问字符串变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43768196/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com