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

multithreading - 为什么我使用 OmniThreadLibrary Parallel.Pipeline 的应用程序在关闭后仍继续在后台运行?

我正在使用 OmniThreadLibrary 来实现用于发送电子邮件的后台管道(请参阅此 SO question)。我注意到关闭应用程序后,它继续在后台运行(在 Windows 任务管理器中看到)。这意味着我的代码在实现 OTL 管道的方式上存在问题。你能帮我找出问题所在吗?

代码如下:

我像这样初始化并调用上面的类:

在应用程序主窗体的 OnCreate 事件中:

主窗体上的按钮在 OnClick 事件中有这个:

后来,我在主窗体的 OnDestroy 事件中像这样释放类:

0 投票
0 回答
211 浏览

multithreading - 如何使用 OmniThreadLibrary 执行排队任务

有人可以给我一些关于如何使用 OmniThreadLibrary 执行“排队”任务的指导。可以是任何东西,但在这个问题中,让我以发送 100 封电子邮件为例。我想一次只使用 3 个线程。

如何排队发送电子邮件?

当 1 个线程完成并准备好接收下一封电子邮件/任务时,我如何收到通知?

如何获得电子邮件发送的结果?(即OK,或发生错误)。

我已经看到了一些使用 OTL 的非常简短的示例,但我需要一些更全面的东西来了解如何执行上述操作。

有人可以解释如何执行上述操作或指向我一个涵盖类似内容的示例。

谢谢

0 投票
1 回答
230 浏览

delphi - 为什么 TTimer 不能在 OTL worker 任务中工作?

我想在另一个线程中运行的 OmniThreadLibrary 工作任务中实现重复性任务。例如,该任务应每 3 秒执行一次。因此,我写了一个TOmniWorker带有实例的后代,TTimer如下所示:

Initialize我在和中设置断点DoOnTimer。前者执行得很好,但后者根本不会被调用。顺便说一句:Cleanup两者都没有被调用,所以任务仍在运行。

我究竟做错了什么?TTimer在 OTL 任务中使用 a 是不可能的吗?如果是,为什么?

更新:我找到了() 的解决方法TTimer但为什么TTimer方法不起作用?

0 投票
0 回答
156 浏览

multithreading - OmniThread:线程池停止工作

我遇到了这个奇怪的错误,omnithread 停止调度任务并停止工作......

这是重现我遇到的错误的代码

当我单击按钮时,它可以很好地创建 200 个任务,但是在从任务管理器中查看线程数时,如果我单击 button1 时线程开始减少,那么线程数会突然下降到 0,然后无论如何很多次我点击 button1 来安排任务,没有创建线程,也没有执行任何功能。我实际上在向调度任务的服务器发送数据时遇到了这个错误,我无法分离服务器代码区域,所以我只是写了一个示例来在用户端生成问题。谁能帮我解决这个问题?

谢谢

0 投票
0 回答
329 浏览

delphi - 在 OTL Async/Await 线程中使用局部变量是否安全?

我很抱歉问了这么简单的问题。这是我第一次在 VCL 中使用后台线程。所以我想知道在异步部分使用局部变量是否安全?

假设我执行此方法 3 次,但第一个线程没有完成。这会导致问题吗?

你会建议另一种方法来解决这个问题吗?(使用后台线程查询数据库,将结果附加到 VCL 数据集中。)

谢谢。

编辑:我已经检查了问题13348970的答案,我的问题被标记为重复。我得出的结论是,如果我的方法被调用 3 次不同的时间,所有 3 个ds局部变量都将指向不同的内存地址,因此每个线程都将访问其 TOracleDataSet 的本地副本,不会有任何问题。如果有人可以确认这一点,我可以关闭问题,谢谢。

0 投票
1 回答
874 浏览

arrays - 如何使用 OmniThreadLibrary 中的 SetParameter 将数组作为参数传递给任务?

在 Delphi XE8 中,我试图SetParameter从 OmniThreadLibrary 将数组传递给 OTL 任务:

编译器抱怨 SetParameter 行:

不幸的是,OTL 书中没有关于如何使用FromArrayinSetParameter将数组传递给任务的示例。

那么如何做到这一点呢?

编辑:ba__friend 要求我在他的回答的评论中显示我的解决方案的源代码:

0 投票
1 回答
4350 浏览

multithreading - 使用 Omni 线程库在 Delphi 中异步获取函数结果

我正在尝试从另一个单元/类调用一个函数,这将需要一些时间来执行任务并返回一个字符串值。我在 Delphi 中找不到与 C# async-await 类似的简单方法的良好参考。使用 Omni Thread 库对我来说似乎是个好主意。

一个简单的例子对我来说是一个很好的开始。

示例方法:

在这里,函数GetMagicString应该异步处理结果。一旦获得结果,程序才应该通知任务已经完成。顺便说一句,我正在使用 Delphi-XE。

Edit1:这是我尝试过的。但我仍然无法找出完成工作的正确方法。问题是如何返回值。

在这里,使用 Result := ResultValue.Value 会占用 UI。

编辑2

我根据提供的答案进行了更改。

MainForm代码:单元Unit1;

其他单元代码:单元Unit2;

是的,代码按预期工作。我只是想知道这是否是做我真正想做的事情的最佳方式。

0 投票
0 回答
349 浏览

delphi - 并行绘制成 TBitmap

这里的问题合并绘制导致线程位图绘制源于使用 TThread 和旧版本的 DELPHI。

我现在发现了 Delphi XE 7 附带的全线程库,并且在使用全线程库编写此代码时无法决定应该使用哪种设计模式来完成此任务。TBitmap 访问是否也像使用 TThread 和 VCL 一样限制使用全线程。

根据我的经验,vcl 中的笔在并行位图处理期间不是线程安全的

当前的单线程代码如下:

0 投票
1 回答
232 浏览

delphi - D2007下不能编译OTL

我下载了 OTL http://www.omnithreadlibrary.com/

并编译D2007 grouproj,安装包,没有问题。

然后我创建了一个使用 OtlParallel 单元的简单控制台应用程序,当然,我将 OtlParallel 和其他一些 pas 文件添加到项目中。

但它抱怨找不到 Generics.Collections。

0 投票
1 回答
508 浏览

delphi - 如何将消息从后台任务发送到 MainForm (OmniThreadLibrary)

如何将消息(TOmniMessage)从后台任务发送到主窗体?

我想向 Mainform 发送以下消息:

main.pas(主窗体)

beep.pas(后台任务)