delphi - 如何在delphi中并行编写一个for-down-to循环,在列表上事件,删除项目?

标签 delphi for-loop parallel-processing delphi-xe2 omnithreadlibrary

以下面的代码为例:

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/

相关文章:

php - 额外变量或对象创建——PHP 中什么更好?

html - 如何在不使用网络浏览器的情况下呈现 HTML 元素?

json - 如何在 RAd Studio 中解析 JSON 数组?

python - 如何在 Python 中循环遍历文本文件的某些部分?

java - 在 Java 中并行化阻塞调用

r - 尝试开始使用doParallel和foreach,但没有任何改善

c# - 为什么有下载并发数限制?

delphi - 请说明包装用途

Delphi——将整数转换为类型指针?

java - 在 Java 中返回 for-each 外部的元素