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

multithreading - 是否可以在 OmniThreadLibrary 中重置/重新初始化管道(或 BackgroundWorker)?

通过重新初始化,我的意思是停止正在运行的任务(或者如果必须的话甚至终止线程)并恢复,就好像管道/线程从未初始化/启动一样。

我的代码(我使用的是delphi 2010,OmniThreadLibrary 3.02)如下所示:

我需要这样的东西:

笔记

  1. FWIW,是的,我完全知道这确实是个坏主意!

  2. 我也很清楚,最好的方法是向任务发送停止信号并等待它们很好地关闭,并经常检查任务内的停止信号。对于这个非常特殊的情况,我对此不感兴趣。

  3. 虽然上面的代码只提到了管道,但重置 BackgroundWorker 的解决方案对我来说就足够了。

提前致谢!

0 投票
2 回答
1188 浏览

delphi - 在OTL中使用时如何通过匿名方法捕获变量?

我想做的事:

我在通用列表中有一些对象。我想以匿名方法捕获每个对象,并将此方法作为单独的 OTL 任务执行。

这是一个简化的例子:

这是结果:

捕获的对象 ID

如您所见,捕获似乎在主线程中运行良好。但是,我不知道是否已捕获指向对象的指针或仅捕获其 ID 字段?

当我尝试捕获对象并将匿名方法传递给CreateTask函数时,事情变得很奇怪。

首先,TMyObject似乎只有第三个实例被捕获。其次,尽管我在通用列表中只有三个对象,但我在控制台日志中有四条消息。第二种行为不一致,有时我在控制台中收到三条消息,有时我有四条消息。

请解释我上面提到的两个问题的原因,并提出一个解决问题的解决方案,并允许我将每个对象实例传递给一个单独的 OTL 任务。(我不想使用普通TThread课程。)

0 投票
2 回答
1045 浏览

delphi - 为什么 .Net 的限制为 32768 时,OmniThreadLibrary 限制为 60 个线程?

我最近比较了 .NET 中的 OmniThreadLibrary 和 ThreadPool,我发现 Omni 在最大线程数方面受到更多限制——允许 60 个——而 .NET在 .NET 4.0 中可以达到32768 。

为什么会有这样的限制?

0 投票
0 回答
704 浏览

delphi - OTL - 按需终止任务

如何按需终止任务?当我这样做时:

主应用程序冻结。即使只有 1 个任务正在运行,我是在调试器外部还是内部运行它并不重要。

因为我不想将此代码放在任务中 30 次。令用户和程序员感到沮丧。

如果没有这个,应该有一种方法可以在全球范围内做到这一点。

0 投票
2 回答
460 浏览

delphi - 如何在一个任务组中使用超过 60 个任务?

如何在一个任务组中使用超过 60 个任务?我可以从 0 循环到 N 并创建任务,但这不会给我任何消息处理。我使用 OTL EventMontior 从任务发送消息..

我问的原因是因为使用 Indy 我被限制为 60 个请求。但是,如果我使用普通的 TThread,我不会遇到这些问题,但会遇到其他问题等。

.NET 线程池最大值:

  • Framework 4.0(32 位环境)中的 1023
  • Framework 4.0(64 位环境)中的 32768
0 投票
2 回答
926 浏览

delphi - 如何确定主线程没有响应 Omni 线程库的原因?

平台:Delphi with VirtualTreeView SVN 5.1.0 & OmniThreadLibrary 3 SVN & Delphi XE2

本来以为是VirtualTreeView的问题。我需要每隔 1 秒或更短的时间将节点添加到 VST。但似乎迟早 CPU 速率会达到 50% 或更多,直到整个应用程序变得完全无响应。

任何人都可以帮忙吗?蒂亚!

编辑:似乎问题来自OTL。使用上面的代码时,将应用程序的 CPU 最小化始终小于 1%,甚至将 10ms sleep 更改为 1ms。

但是,下面的代码将重现困扰我的问题。

PS:为了避免 OTL 默认的 1000 队列大小泛滥,我在每个线程中都有一个锁,等待添加节点在下一个 Task.Comm.Send 操作之前完成。

PPS:这里的 10ms 只是为了快速重现问题,而不是在实际情况下。所以不要费心问为什么?

好的,结论是:如果您需要定期更新该节点,则不要在单个节点上添加太多节点,节点越多更新它们的cpu时间越多。

0 投票
1 回答
1123 浏览

macos - 将多线程 Delphi 应用程序移植到 Mac:我的选择是什么?

我需要将应用程序(用 XE2 编写)移植到 Mac。

我的应用程序分为简单UI executable(单线程)和不可见engine严重依赖 OmniThreadLibrary 3.02Cromis DirectoryWatch

两个 EXE 都通过Cromis.IPC进行通信

这就是说我主要对这 3 个组件(OmniThreadLibrary、Cromis IPC 和 DirectoryWatch)有问题

我现在的重点是引擎,它拥有大部分代码。

我的问题是:有没有类似于OmniThreadLibrary、Cromis DirectoryWatch 和 Cromis.IPC for Mac 的东西?(无论是 Lazarus 还是 XE2 都以 Mac 作为目标编译器)

答案将对我决定是否应该使用 Delphi XE2 或 Lazarus(我完全不熟悉的 IDE)有很大帮助并了解什么是提供/支持 Windows 和 Mac 的最佳长期方法,且头痛最小

0 投票
1 回答
9096 浏览

delphi - 如何从第二个线程更新进度指示器?

我有一个带有进度指示器的主表单。在数据模块中,我有十个数据集,每个数据集都定义了一个 OnBeforeOpen 事件。

我想通过主窗体中的进度条显示已打开数据集的进度百分比。

由于我对多线程编程完全陌生,有人可以给我一些建议吗?

非常感谢你

0 投票
2 回答
1537 浏览

delphi - 如何将参数传递给 OmniThreadLibrary 中的 Parallel.Async()?

如何将一些参数从主线程传递到工作线程(即以下procedure)?

如果检查IOmniTaskConfig(在 OtlParallel.pas 中)的定义,则有一个commented out名为 的属性Param,如下所示:

所以我想我的问题的答案是否定的,但我希望不是!

0 投票
1 回答
1326 浏览

delphi - 为什么 OmniThreadLibrary 的 ForEach 会阻塞主线程?

使用 OmniThreadLibrary 和 Delphi XE4,我希望在后台运行多个线程来处理数据,从而提高我现有代码的速度。

调用以下过程时,应用程序 GUI 将停止处理任何输入,直到所有线程都完成。我的理解是.NoWait即使线程正在运行,使用也应该允许过程退出。

是不是我对 ForEach 循环的理解不正确,提示我应该使用另一种方法来实现后台处理?感谢您对正确使用 OmniThreadLibrary 的任何建议。