以下面的代码为例:

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很大,每次迭代后使用后释放项目对于最小化内存使用很重要。

最佳答案

简单的答案:您不会。

涉及更多的答案:在并行化操作中,您要做的最后一件事是修改共享状态,例如此delete调用。由于不能保证每个任务都会“按顺序”完成-实际上,他们很可能至少不会一次完成,因此您添加到总工作量中的任务越多,这种可能性很快就会接近100%,试图做类似的事情正在玩火。

您可以在销毁项目时对其进行序列化,也可以并行进行,以更快地完成并销毁整个列表。但是我不认为有两种方法都可以做到。

10-06 03:37