问题标签 [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 回答
273 浏览

delphi - 使用全线程库的并行霍夫算法

我想使用霍夫圆检测加速图像处理。

由于 VCL 位图不是线程安全的,我想我只能对内部 Theta Loop 进行并行处理?加速此代码的最佳方法是什么。

0 投票
1 回答
239 浏览

delphi - proper construction of ParallelTask (IOmniParallelTask) with cancellation & termination handler

I am just playing around with the OmniThreadLibrary after reading the docs, but I am still facing some simple/early problems on constructing a ParallelTask.

After the construction of a ParallelTask with cancellationToken and terminationHandler, terminationHandler.OnTerminated and OnStop are not being executed after the async execution is done and I was not able to find out why :-(

I hope some of the OTL pros can help me out on this one.

What I want to achieve:

  • execute an asynchronous operation
  • stop execution when cancelled (cancellationtoken)
  • execute some code in the mainthread (checking for exceptions) when the async operation is done

What I did so far:

After reading the docs I created a ParallelTask, setting up cancellationToken and terminationHandler via TaskConfig and executed the operation. The executed operation itself checks for the cancellationToken being signalled and does its work (here a Sleep of 1s). The HandleOnTerminated method checks for errors and sets the fIsDone and fHasError flags, getting read by someone from mainthread.

With this peace of Code, fIsDone is never set, because HandleOnTerminate and HandleOnStopare never called. So with the exmaple from above the following ConsoleApplication seems to never end:

0 投票
1 回答
172 浏览

delphi - IOmniParallelTask​​ 的异常处理不起作用

执行中未处理的异常IOmniParallelTask应该(据我了解文档)由 OTL 捕获并附加到IOmniTaskControl实例,该实例可以由termination handlerfrom访问IOmniTaskConfig

所以在用这样的设置IOmniParallelTask实例之后termination handler

内的任何未处理的异常TaskToExecute

应该附加到IOmniTaskControl您在以下范围内获得的实例termination handler

此时的问题是,没有分配异常IOmniTaskControl.FatalException我不知道为什么。

也许你们中的一些人对我做错了什么有一些想法。整个 VCL 示例项目可以在这里找到:https ://github.com/stackoverflow-samples/OTLTaskException

0 投票
0 回答
264 浏览

delphi - OmniThreadLibrary 的 Parallel.ForEach 中的内存泄漏

我用OmniThreadLibrary. 它有一个并行的方法ForEach

我正在研究高负载系统,我需要并行处理一些数组。但是我遇到了内存泄漏。

这是一个示例:

当我运行这段代码时,我可以看到虚拟内存泄漏。

怎么了?

0 投票
1 回答
247 浏览

delphi - 如何防止 OTL Pipeline 将其输入密封?

多年前,在旧论坛上,我问 Primozh,Pipeline 模式是否可以像 Uroboros 一样,将半完整的结果反馈给它自己。

当时 Primozh 表示这将是直截了当的,PipeLine 阶段不仅可以将 OmniValues 提供给 OUTPUT,还可以提供给 INPUT。

问题是初始喂养阶段运行得太快,它们过期并密封输入集合并且没有办法解封它,因此一旦他们尝试将半生不熟的数据包送回自己 - 瞧!- OTL 抛出“无法添加到已完成的集合”异常。

那么上面链接的这个自爆任务,如何通过自喂Pipeline模式来实现呢?

UPD:将示例从“自爆炸” - 生成大量中间半计算结果 - 排列生成,更改为简单(我希望)计算阶乘。然而,这具有确定性的缺点:它总是生成一个中间作业项,因此管道处理不断增长的集合的能力没有被尝到。

它在管道阶段尝试重新填充意外被密封的输入时崩溃TOmniPipeline.Run。在标记的行处,意外抛出了“无法添加到已完成的集合”异常。

当收集在空和少数之间平衡时如何保持管道运行(这不仅是开始条件,它会在计算结束附近重复)?

有点梦想:https
://plus.google.com/+AriochThe/posts/LCHnSCmZYtx 更多:https ://github.com/gabr42/OmniThreadLibrary/issues/61

0 投票
1 回答
542 浏览

delphi - 使用 IOmniTaskControl/TOmniWorker 时等待 Invoke 完成

我使用 TOmniWorker 创建了一个 IOmniTaskControl,以便我可以定期在特定线程上运行代码块。因此,我将根据需要在此 IOmniTaskControl 上调用 Invoke。当我这样做时,有时我需要等待与该工作相关的执行完成。

在 Invoke 之后,我尝试在 IOmniTaskControl 上调用 WaitFor(INFINITE),但它挂起。我进行了调试,可以看到 Invoke 调用上的方法已完成。与 TOmniWorker 一起使用时,我是否误解了 WaitFor 与 IOmniTaskControl 的使用?

编辑:我在测试文件夹中编辑了 test_43_InvokeAnonymous 项目,我看到了相同的行为:

使用上面的代码,task.WaitFor(INFINITE);挂起。

0 投票
0 回答
393 浏览

multithreading - 绘制多边形多线程delphi

在相当长的一段时间里,我试图提高我的绘画程序的速度。不幸的是,我刚刚通过使用 OmnithreadLibrary 以及并行化绘制过程和对象的加载过程实现了一些小的改进。

我的任务详细信息: 我在数据库中存储了 >1.000.000 个对象(多边形、矩形和圆形)。用户应该能够通过 Type/Position ... 选择和绘制元素。用户选择的元素数量从 1 到存储在数据库中的最大元素数量不等。

绘制大量多边形 (>100000) 非常耗时。目前,我的代码实现了 25% 的改进。

您将如何加快绘画过程?错误在哪里?我将非常感谢任何建议。:)

我的代码详解 开始将 SQL DB 中的对象加载到 ElementArray 中。这是由几个加载线程完成的。加载第一个 Object 后,绘画线程开始将 Data 转换为 TPoints 数组。转换数据和绘制数据是在几个线程中完成的。除一个例外(合并位图)的所有进程并行运行。

加载数据库在几秒钟内完成。绘画过程是瓶颈!

最好的,迈克尔

0 投票
1 回答
172 浏览

delphi - 使用 IOmniTaskControl/TOmniWorker 时如何检查异常?

我正在使用 IOmniTaskControl/TOmniWorker 将代码执行集中到特定线程上。我将重复使用此 IOmniTaskControl 进行多次 Invoke 调用。如何检查调用期间可能发生的异常?这是问题/答案的后续问题:使用 IOmniTaskControl/TOmniWorker 时等待 Invoke 完成

我检查了 IOmniTaskControl 的 ExitCode 和 FatalException,但没有设置它们。似乎 IOmniTaskControl 将为每个 Invoke 调用自动创建一个新任务,如果发生异常,则会将异常置于该任务上。但是,在 Invoke 完成后,我没有提及该任务。我使用 TOmniWaitableValue 来标记调用何时完成,但不清楚我需要做什么才能使从 WaitFor(...) 返回时发生的任何异常对我可用。

这是我拥有的结构的一个片段:

因此,在上述设置中,如何在 FWaitable.WaitFor(INFINITE) 之后检查 Proc() 调用期间可能发生的任何异常。我想在调用线程中再次提出它。

0 投票
1 回答
314 浏览

multithreading - 从另一个线程运行的管道上的 OmniThreadLibrary 内存泄漏(消耗)

我正在从另一个线程运行管道(来自 OmniThreadLibrary 的线程管道),并且出现内存泄漏或更确切地说是内存消耗。但是当应用程序关闭时就可以了,并且没有内存泄漏报告(ReportMemoryLeaksOnShutdown := True;)。

此处示例:单击按钮 10 次,测试应用程序将获得约 600 MB 的内存。Windows 7 x64,Delphi XE6,最新的全源。

这是一个错误?或者我需要使用其他代码?

编辑 1: 使用 ProcessExplorer 测试该代码,发现运行时线程数是恒定的,但句柄数增加了。如果我Application.ProcessMessages;在“for循环”的末尾插入(在管道代码之后)然后测试应用程序运行良好,句柄正在关闭并且内存消耗是恒定的。不知道为什么。

0 投票
1 回答
365 浏览

postgresql - 使用 Devart 的 PgDAC 组件在 Delphi 的单独线程中处理来自 PostgreSQL 的 NOTICE 事件

我想在一个单独的线程中执行长查询,以便能够中止它们并向用户提供反馈。所有这一切都有效,但我有时会遇到访问冲突,因为我认为 OnNotice 事件的处理没有以正确的方式完成,我想知道这样做的正确方式。

我在 Delphi 2010 上使用 Devart 的 PgDAC 和 OmniThreadLibrary。

我执行的 PostgreSQL 代码是一个存储过程,其中包含以下内容:

这是我的代码中有趣的部分:

ThreadConnection是将用于执行查询的 TPgConnection(在单独的线程中)。

这就是“中断查询”按钮的作用。我不确定这是否非常“线程安全”,因为它在主线程中使用,但在专用于查询执行线程的 TPgConnection 上做了一些事情。

这是我显示线程执行期间发生的错误(如 SQL 错误或查询取消)的地方。

这是 OnNotice 事件处理。它所做的只是修改标签的标题。

这就是查询的运行方式。

所以PgConnectionNotice事件(在主线程中运行)附加到ThreadConnection(在查询执行线程中使用),这就是我怀疑生成这些随机访问冲突的原因。

我不知道如何处理这个。lock我应该在 PgConnectionNotice中使用某种when (同步?)。

这是我尝试过的:

在 PgConnectionNotice(MsgId=2)中发送的消息永远不会被OmniEventMonitor1TaskMessage.

我曾尝试使用CalculationTask.Invoke但不明白如何调用它以传递字符串参数(我认为 Delphi 2010 不允许匿名函数)。

当我尝试像这样取消查询的更简单操作时,它停止取消查询:

所以我想我不应该通过CalculationTask. 我应该将创建的任务存储在InternalExecQuery全局变量中并使用它吗?