问题标签 [omnithreadlibrary]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
699 浏览

delphi - 如何从Delphi xe2中的OTL终止parallel.foreach

我正在学习如何在 Delphi XE2 中使用 OmniThreadLibrary,我想知道是否有人可以告诉我如何取消 parallel.foreach。

我读到我应该使用取消令牌,但我找不到某种关于如何使用它的示例。

这是函数内部的原始 for 循环。

这就是我使用 Parallel.ForEach 的方式

在 Parallel.ForEach 内部我不能这样做Result := 'ERROR',因为它没有在程序内部捕获,所以我认为如果我可以取消 Parallel.ForEach 并报告取消,那么我可以在Result := 'ERROR'外部分配。

但我是 OmniThreadLibrary 的新手,我不知道该怎么做,请帮助我:)

0 投票
3 回答
556 浏览

multithreading - 使用 OmniThreadLibrary 并行写入数组比串行写入慢

我正在研究差分进化优化算法的实现,并希望通过并行计算总体成员来加快计算时间。我正在使用 OmniThread 库,并成功地并行化了我的循环,却发现它比串行实现运行得更慢。

我已经将代码简化为本质来测试并行化,而简化版本也出现了同样的问题:并行版本比串行版本慢。

关键是我传递了多个动态数组,应该为每个总体成员写入输出。每个数组都有一个专用于人口成员的维度,因此对于每个人口成员,可以访问一组不同的数组索引。这也意味着在并行实现中没有 2 个线程将写入相同的数组元素。

在我用来测试的代码下面(差分进化中的实际代码有一个DoWork带有更多const参数和var数组的过程)

我原本预计我的 8 核处理器的加速速度约为 6 倍,但遇到了轻微的减速。我应该改变什么来获得并行运行DoWork过程的加速?

请注意,我更愿意将实际工作保留在DoWork过程中,因为我必须能够在有和没有并行化(布尔标志)的情况下调用相同的算法,同时保持代码主体共享以便于维护

0 投票
1 回答
286 浏览

delphi - 为什么我在使用 OTL 时收到此错误?

我第一次使用 OTL,我试图使用 Async/Await 抽象。

现在,我创建了一个小程序来看看会发生什么。它只是一个按钮,它调用这个过程。

第一次尝试

为此,它第一次工作正常,禁用按钮,为异步休眠,然后重新启用它。

但是我第二次单击该按钮时,它被禁用但永远不会再次启用。

第二次尝试

这次我想显示一条消息 x100 次,它第一次也可以工作,但是当我再次调用该过程时,我收到以下错误TOminCommunicationEndpoint.Send: Queue is full

使用过这个库的人可以向我解释一下,为什么会出现这个错误?如果它与第一次尝试的问题有关?

0 投票
1 回答
239 浏览

delphi - 我可以使用 OTL 来并行化嵌套循环吗?

我想知道是否可以使用 OTL 来并行化这个循环。

我有以下代码。

是否可以将 GridMat(来自 SDL_matrix.TMatrix)作为参数传递给所有并行 ForEach 并将值添加到其中。

0 投票
2 回答
618 浏览

delphi - 为什么以下使用 IOmniThreadPool 的代码会导致访问冲突?

在我们的 Delphi XE4 应用程序中,我们使用 MaxExecuting=4 的 OmniThreadPool 来提高某个计算的效率。不幸的是,我们遇到了间歇性访问违规问题(例如,请参阅以下 MadExcept 错误报告http://ec2-72-44-42-247.compute-1.amazonaws.com/BugReport.txt)。我能够构建以下示例来演示该问题。运行以下控制台应用程序后,System.SyncObjs.TCriticalSection.Acquire 中的访问冲突通常在一分钟左右发生。谁能告诉我我在下面的代码中做错了什么,或者告诉我另一种实现预期结果的方法?

0 投票
1 回答
512 浏览

multithreading - TOmniEventMonitor 可以在后台线程中使用吗?

原始问题

在我们的 Delphi XE4 应用程序中,我们使用 TOmniEventMonitor 来接收来自其他任务的消息。只要它在主线程中运行,它就可以正常工作,但是一旦我将相同的代码放入任务中,TOmniEventMonitor 就会停止接收消息。我在下面包含了一个简单的示例——单击 Button_TestInMainThread 会导致按预期写入文件,而单击 Button_TestInBackgroundThread 则不会。这是设计使然,还是有一些方法可以在仍然使用 TOmniEventMonitor 的同时使其正常工作?

额外的观察

使用以下代码,似乎可以在后台线程中成功使用 TOmniEventMonitor。这确实是一个非常笨拙的解决方案——一个 IOmniTwoWayChannel 被创建但没有以任何有意义的方式使用——但是当我尝试通过注释掉标记为“不要删除!”的任何一行来简化代码时,HandleTaskMessage 不会不要再被叫了。谁能告诉我我在这里做错了什么?

0 投票
0 回答
262 浏览

delphi - Error when using strings in TOmniValue array in a BackgroundWorker

When I have a string in a TOmniValue array, then accessing the value by name or by explicit index raises an access violation. See the following code for an example. Am I doing something wrong, or is there an error in Delphi or TOmniValue? I found a workaround for accessing by index, but what about by name?

UPDATE: I've moved Test into a console app for easier reproduction, but now the error only occurs in every second run or so instead of every interation. Or maybe it is not even the same error now?

I'm using the newest trunk of Otl (r1333). I believe I had the same error in 3.03a.

0 投票
1 回答
212 浏览

delphi - 为什么 TOmniValue 不接受名称长度等于 1 的命名值?

以下程序导致错误,在TOmniValue.CreateNamed.

例外是Exception带有消息的类型:

TOmniValue.CreateNamed:无效的名称类型

如果名称的长度超过一个字符,则代码运行时不会出错并报告预期的输出。

是我的代码有问题,还是库有问题?

0 投票
1 回答
123 浏览

delphi - 有没有办法获取 OmniThreadLibrary 的 TOmniBlockingCollection 的大小?

有没有办法获取 OmniThreadLibrary 的 TOmniBlockingCollection 的大小(即元素的数量)?

我检查了代码,我的初步结论是否定的,但我不确定。

0 投票
1 回答
218 浏览

delphi - 在没有 TOmniEventMonitor 的情况下运行

我如何在没有 的情况下运行任务TOmniEventMonitor?如果我在没有它的情况下启动它们,主线程就会冻结。这没有任何意义,因为OmniThreadLibrary应该基于TThread. UnObserved并没有真正解决这个问题,因为它只是制作同一事物的内部副本。

如果我创建一个TThread它不需要任何类型的“监视器”,它也不会阻塞主线程。我没有发送任何类型的消息,为什么需要“监视器”?