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

delphi - 如何在delphi中并行编写for-down-to循环,在列表中活动,在进行时删除项目?

以下面的代码为例:

例如,您将如何使用 OmniThreadLibrary 将其并行化?可能吗?还是需要重组?

我在每次迭代时都调用myStringList.Delete(i);它,因为在每次迭代中StringList使用后释放项目对于最小化内存使用很重要。

0 投票
0 回答
159 浏览

delphi - TOmniTaskControl:WinXP 上的 .Run 与 .Schedule

在Windows XP 32 位虚拟机上测试我的一些代码时,我注意到一些事情:我的应用程序总是挂起。我在我的Windows 7 64 位计算机上从未出现过这种现象,但它在 VM 上是 100% 可重现的。
通过远程调试,我发现程序挂在了IOmniTaskControl.WaitForInit. 我设置了一个断点,TOmniWorker.Initialize但它没有被触发。

这是我创建任务的方法:

当我替换FTaskControl.ScheduleFTaskControl.Run任务初始化时,运行良好并且我的应用程序不会冻结。

我的问题:

  1. 我一直在滥用Schedule电话吗?我认为这是一个可以使用的,因为它没有等待实际运行,并且任务在短时间内开始。它应该如何使用?

    或者

  2. 这是关于 Windows XP 上的线程(通过OmniThreadLibrary )的一些问题/不兼容性吗?

0 投票
0 回答
478 浏览

delphi - 如何在线程执行时阻止所有传入消息到表单

我有当前的情况,我使用omnithreadlibrary 进行一些通用的后台工作,如下所示:

所以在我开始执行之前,我会像这样阻止界面:

当线程完成时,我像这样释放块:

注意:TPresentationFormWorker 是一个动画表单,我把它放在忙碌的表单中。

问题是,当表单“忙”执行线程时,即使我禁用它,我仍然可以与他交互,例如:

  • 我可以点击任何按钮,当线程完成执行时,按钮的动作被触发;
  • 我可以输入任何控件,例如编辑一些无意义的信息,当线程完成执行时,我提供给控件的内容将被擦除回之前(ui rollback?lol);

所以我的猜测是,由于 application.processmessages 线程正在工作,我对禁用表单所做的交互被发送到队列,一旦线程完成,它们都会被发送回表单。

我的问题是:是否可以实际禁用表单,当我说禁用时,我的意思是阻止所有消息,直到我手动允许可以再次开始接受的某个点?

提前谢谢。

0 投票
1 回答
119 浏览

multithreading - 取消计划任务

我有一个接收事件的 Windows Delphi 应用程序,对于这些事件中的每一个,我想以并行方式运行任务(这样我就可以为以下事件做好准备)。通过全线程库的抽象有很多方法可以做到这一点。

问题是我的部分代码需要在接收到事件后立即执行(基本上是为了“解码”事件参数),而另一部分需要在没有发生任何新情况的情况下在几秒钟后执行相同的上下文。此行为应响应“仅在持续时间超过 3000 毫秒时才存储此新值,否则只需取消它”。因此,如果新事件以相同的上下文到达,我需要“取消”正在运行的任务(等待 3000 毫秒的任务)。我不能使用管道抽象,因为当第一阶段结束时,它会自动填充第二阶段队列,而不会询问我是否要取消它。

那可能吗?

谢谢你。

0 投票
1 回答
384 浏览

multithreading - 如何使用 OmniThreadLibrary 设计操作“传送器”?

我有一个 Windows Delphi 应用程序,其中包含可通过通知图标访问的“开始”和“停止”菜单项。单击“开始”后,我需要执行以下操作(如我所见):

  1. ThreadMonitor:第一个线程正在等待指定文件夹中指定文件的出现。

  2. ThreadParse:一旦文件出现,它应该被转移到另一个线程(用于解析内容)并继续监视下一个文件。

  3. ThreadDB : 解析完所有数据后,将它们保存到 MySQL DB 中。(另一个具有活动数据库连接的后台线程?)

  4. ThreadLog:如果步骤 1-3 中有任何错误,请将它们写入日志文件(另一个后台线程?),而不中断步骤 1-3。

也就是说,事实证明,它就像一个连续的传送带,其工作仅通过按下停止来停止。我应该从 OmniThreadLibrary 的各种方法中使用什么?

0 投票
1 回答
571 浏览

delphi - 使用 SuperObject 和 OmniThreadLibrary 从 DLL 获取 JSON 数据的问题

我正在使用 Delphi XE,我的程序和 DLL 有以下代码:


当我尝试运行调试代码时,在调用 dll GetJSON 函数几次后,我收到以下错误:
项目 test_OTL_SO.exe 引发异常类 EAccessViolation,并显示消息‘模块‘my.dll’中地址 005A2F8A 的访问冲突。写入地址 00610754'。
但是,当我使用相同的本地函数 GetJSON_local 时,不会出现此问题。
谁能建议我在这里做错了什么?

编辑:(解决方案)

我为我的 DLL 编写了这段代码:

并更改了 Async_Parse 过程的代码:

0 投票
2 回答
377 浏览

multithreading - 如何知道 OmniThreadLibrary 中 Pipeline 阶段的状态?

gabr 对另一个问题的回答显示了使用 Parallel.Pipeline 进行数据处理的示例。
目前我需要知道 Pipeline 何时启动以及其所有阶段何时完成。我阅读了其他 gabr 对此问题的回答如何在 OmniThreadLibrary 中监控管道阶段?. 我试着这样做(根据答案修改):

task.Comm.Send(WM_STARTED)一切正常,但该行永远task.Comm.Send(WM_ENDED)不会执行。我怎么知道最后一个阶段何时完成?正确的方法是什么?

0 投票
0 回答
768 浏览

delphi - Delphi TParallel 没有使用所有可用的 cpu

我们正在将我们的多线程应用程序迁移到 Delphi XE7 并测试新的 TParallel.For 函数。我们发现它在笔记本电脑(Core I-5/Windows 7 with 4 cores)上的并行性很好,实现了接近一致的 100% cpu 使用率。

当我们在具有 2x12 内核的 Intel Xeon/Windows 2008 R2 上运行完全相同的代码时,它只实现了大约 3% 的使用率,并且似乎只使用了 2 个内核。

使用 Conways Life 演示示例应用程序时,同样的问题也很明显。

我们曾尝试在 Xeon 上使用并行化接近 100% 的 OTL,但不幸的是,我们遇到了“配额不足”的问题,似乎也无法解决这个问题。

有没有其他人遇到过这个?我们曾尝试使用 Stride 参数、SetMinWorkerThreads 和 SetMaxWorkerThreads() 方法,但无济于事。

0 投票
1 回答
403 浏览

multithreading - OTL 的 Parallel.ForEach 的重复调用次数限制

我开始使用 OTL 进行多线程,并获得了很大的帮助!

各种使用Parallel.ForEach都成功了。但是现在我遇到了一个无法解释的案例。

请参阅下面的简单完整代码:

当迭代次数超过 1250 时,出现错误:

'System Error. Code: 1816. Not enough quota is available to process this command'.

我会误解 OTL 的任何基本用法吗?

0 投票
1 回答
157 浏览

multithreading - 对于实现线程电子邮件发送队列的类,设计会是什么样子?

所以我的应用程序是一个出租车呼叫调度系统,其中操作员通过电话接听电话并将接听的电话分配给司机。在输入呼叫详细信息的“呼叫详细信息”表单上,单击“保存”按钮后,该表单应关闭,应在后台线程中向出租车司机发送电子邮件,并显示主表单,他可以在其中选择下一个呼叫并将其分配给另一个驱动程序。

设计的难点在于它应该是一个队列,这意味着队列中的电子邮件需要等到对正在发送的电子邮件的处理完成。当然,电子邮件发送发生在与 VCL 主线程不同的线程中。

对主线程的唯一响应将是队列中剩余的电子邮件数量,通过从主线程到电子邮件程序线程的函数调用。例如。如果用户试图关闭应用程序,它将询问电子邮件队列类是否有任何电子邮件待处理。

在 Delphi 中,什么样的类设计和构造最能实现这个功能?我确定它有一个或多个 TThreads,但除此之外我迷路了。我本可以开始写一些东西,但我确信它是错误的,我需要把它拆开,在这里发布并根据建议重新开始。这就是为什么我首先在​​这里发布 - 我想要设计技巧。由于我使用的是 Delphi,所以我在这里发布是因为我想要特定于 Delphi 的设计技巧。提前感谢您的任何答案。

注意:我愿意使用 TThread 实现或 OmniThreadLibrary。

我为该课程提供了一个基本模板,答案需要扩展和构建。