以下面的代码为例:
for i := (myStringList.Count - 1) DownTo 0 do begin
dataList := SplitString(myStringList[i], #9);
x := StrToFloat(dataList[0]);
y := StrToFloat(dataList[1]);
z := StrToFloat(dataList[2]);
//Do something with these variables
myOutputRecordArray[i] := {SomeFunctionOf}(x,y,z)
//Free Used List Item
myStringList.Delete(i);
end;
//Free Memory
myStringList.Free;
您将如何使用 OmniThreadLibrary 等来并行化此操作?是否可以?还是需要重组?
我在每次迭代时调用myStringList.Delete(i);
,因为StringList
很大,并且在每次迭代使用后释放项目对于最大限度地减少内存使用非常重要.
最佳答案
简单的答案:你不会。
更多涉及的答案:在并行操作中你想做的最后一件事是修改共享状态,例如这个删除调用。由于不能保证每个单独的任务都会“按顺序”完成——事实上,它们很可能至少不会完成一次,随着您添加到总工作负载中的任务越多,这种概率很快就会接近 100%——尝试做这样的事情就是在玩火。
您可以在进行时销毁项目并进行序列化,也可以并行进行,更快地完成并销毁整个列表。但我不认为有什么办法可以两全其美。
关于delphi - 如何在delphi中并行编写一个for-down-to循环,在列表上事件,删除项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27137959/