问题标签 [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 投票
1 回答
159 浏览

delphi - Error "Task can be only monitored with a single monitor" when setting my monitor to a task in dll

I use OmniThreadLibrary 2.09 in my dll, main application and dll are using the same SimpleShareMem memory manager.

I created my own monitor with this code:

When I try to create a new task with this monitor, I'm getting an error "Task can be only monitored with a single monitor"

How can I monitor my task with my own monitor?

0 投票
1 回答
348 浏览

delphi - 如何监控 OmniThreadLibrary 中的管道阶段?

是否可以以某种方式监控管道任务?我试图像这样为每个任务添加监视器

但是出现异常“只能使用单个监视器监视任务”(据我了解,发生这种情况是因为已经为管道阶段安装了内部隐藏监视器)。

0 投票
1 回答
1045 浏览

multithreading - 使用 OmniThreadLibrary Future 的正确方法

我目前正在尝试使用 OmniThreadLibrary。附上我的代码:

我会调用 LongWait() 并且它可以正常工作而不会阻塞 UI。我想做的是:

  • 让任务在等待值的同时在后台运行
  • 如果引发异常,我希望主线程捕获它
  • 允许主线程确定任务是完成还是取消

是否有可能做一个非阻塞函数来完成所有这些?

先感谢您,

五。

编辑:添加问题

0 投票
2 回答
178 浏览

multithreading - TOmniMREW 是否有 CPU 密集度较低的替代方案?

我在追求一个纤细的单读多写锁,类似于 TOmniMREW,但在争用的情况下这会减少 CPU 密集度。

TOmniREW 仅使用自旋锁,因此线程将飙升至 100% 的 CPU 使用率,直到它们能够获得锁。

目前我正在使用一个关键部分,虽然它的行为效率较低(我的读者比作者多),但在争用线程的情况下会放弃它们的 CPU 时间。

在我的情况下,争用非常偶尔发生,通常是在编写器触发更复杂(冗长)的操作时,但是当它触发时,自旋锁的 CPU 使用率会飙升。

Windows SRW 实现使用类似的策略并且没有帮助编辑:实际上在某些高争用的情况下它大约快 2-3 倍,但仍然显示问题 编辑 2: TOmniMREW 将在未来版本中使用 SRW,所以速度将是相同的)。

0 投票
0 回答
553 浏览

delphi - iOS/Android/OSX 的 OmniThread 替代品?

在 iOS/Android/OSX 下是否有 OmniThread 的替代品?

它不需要像 OmniThread 那样完整,我只需要能够拥有线程池和 TFuture<> 类。

谢谢!

更新:Delphi XE7 现在在 System.Threading 中实现 Future/Parallel/Task。

0 投票
0 回答
256 浏览

multithreading - 为多阶段进程正确的 OmniThread 抽象

我有一种复杂的多阶段过程,需要在后台(我正在使用 OmniThreadLibrary)为文档执行以下阶段,首先在主线程中创建需要执行多个阶段的对象(接口对象) .

在主线程中创建对象后,用户将其发送到处理队列(这是我将其发送到OmniThread Pipeline的位置)并执行以下阶段:

  1. 第 1 阶段)在此文档(本地)上执行一些“昂贵”的计算并将其保存到数据库(使用 IBObjects,我在此阶段创建自己的数据库连接)
  2. 第 2 阶段)将此文档发送到执行一些其他计算的 WebService,将结果保存到数据库(我确保调用 CoInitialize/CoUninitialize)<- 由于 Internet 超时、Web 服务错误、Web 服务,此阶段可能会失败维护窗口等需要处理这些。
  3. 第 3 阶段)生成该文档的 PDF 文件(使用 FastReports)并将其保存到磁盘。
  4. 第 4 阶段)可选 - 通过电子邮件发送此文档。<- 这也可能因 Internet 超时、其他错误等而失败。

从所有 OmniThreadLibrary 抽象(高和低)中,管道是这个特定问题的最佳抽象吗?还是应该只使用低级抽象对队列和阶段进行编程?

其他担忧:

  • 我需要它是一个先进先出队列。
  • ¿ 如何在第 2 和第 4 阶段处理异常(和重试)?
  • ¿ 在主线程中创建对象是个好主意,还是应该在每个阶段实例化数据库对象并从内存中释放它?
  • ¿ 在执行数据库更新时我应该使用锁吗?
  • Pipeline 抽象需要知道我何时完成“添加项目”,但是在我的应用程序生命周期中,用户可以添加从一个到数百个文档,因此我永远不能调用“CompleteAdding”或者¿我应该为每个文档创建一个新管道以过程?

谢谢

0 投票
2 回答
186 浏览

delphi - 在 TOmniMessage 中释放嵌入对象的正确方法是什么?

我的任务是发送各种带有数据的消息。

例如:

在接收方我有

但我不觉得 MsgData.Clear 会正确地取消分配所有内存。

TomniValue 释放的正确处理是什么?

0 投票
1 回答
281 浏览

delphi - OmniThreadLibrary 可以在 Delphi Windows 服务中使用吗?

OmniThreadLibrary 是一个非常有趣的库。但是,我担心它在 Windows 服务中的使用。

存储库中的所有测试都是基于表单的。他们中的大多数使用(隐式或显式)基于消息的基础架构(通过 TOmniEventMonitor)。

我做了一个小型 DUnit 测试,但它从未按预期工作。它只是在我将 Application.ProcessMessages 放在代码的几个关键位置之后才开始工作。(!)

相同的测试在 Forms 应用程序中正常工作。但绝不会在像 DUnit 测试这样的连续过程代码中。

我错过了什么?如何在 Windows 服务中使用 OmniThreadLibrary?还是在一个连续的过程中没有在几个点上传播 Application.ProcessMessages?

0 投票
3 回答
351 浏览

delphi - 使用 delphi OmniThreadLibrary 读取平面文件

我正在用delphi阅读非常宽的文件

该文件以逗号分隔,大部分时间用于解析字符串。

逻辑如下

  1. 打开文件
  2. 读线
  3. 将行拆分为记录数组
  4. 将吐出的数组传递给下一个过程
  5. 转到第 2 步
  6. 关闭文件。

我想并行运行第 3 步,目前正在查看 OmniThreadLibrary。

最好的方法是什么?

我应该使用 Parallel For 吗?胡椒烯?或队列?

我正在考虑使用“Parallel For”,但问题是我不知道文件有多少行

0 投票
1 回答
510 浏览

delphi - 正确安装OmniThreadLibrary

我想在我正在使用 Delphi XE2 的项目中使用 OmniThreadLibrary,我已按照说明进行操作。

  • 将 OTL 文件夹和 OTL/src 添加到 Delphi 的库路径中。
  • 在 Delphi XE2 包中构建两个项目并安装。

说明非常简单,OmniEventMonitor 在调色板中。

但是,我无法运行单个示例。

例如,当我尝试运行时:

我收到错误Undeclared Identifier Parallel

我在安装过程中做错了吗?