问题标签 [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.
multithreading - 是否可以在 OmniThreadLibrary 中重置/重新初始化管道(或 BackgroundWorker)?
通过重新初始化,我的意思是停止正在运行的任务(或者如果必须的话甚至终止线程)并恢复,就好像管道/线程从未初始化/启动一样。
我的代码(我使用的是delphi 2010,OmniThreadLibrary 3.02)如下所示:
我需要这样的东西:
笔记
FWIW,是的,我完全知道这确实是个坏主意!
我也很清楚,最好的方法是向任务发送停止信号并等待它们很好地关闭,并经常检查任务内的停止信号。对于这个非常特殊的情况,我对此不感兴趣。
虽然上面的代码只提到了管道,但重置 BackgroundWorker 的解决方案对我来说就足够了。
提前致谢!
delphi - 在OTL中使用时如何通过匿名方法捕获变量?
我想做的事:
我在通用列表中有一些对象。我想以匿名方法捕获每个对象,并将此方法作为单独的 OTL 任务执行。
这是一个简化的例子:
这是结果:
如您所见,捕获似乎在主线程中运行良好。但是,我不知道是否已捕获指向对象的指针或仅捕获其 ID 字段?
当我尝试捕获对象并将匿名方法传递给CreateTask
函数时,事情变得很奇怪。
首先,TMyObject
似乎只有第三个实例被捕获。其次,尽管我在通用列表中只有三个对象,但我在控制台日志中有四条消息。第二种行为不一致,有时我在控制台中收到三条消息,有时我有四条消息。
请解释我上面提到的两个问题的原因,并提出一个解决问题的解决方案,并允许我将每个对象实例传递给一个单独的 OTL 任务。(我不想使用普通TThread
课程。)
delphi - 为什么 .Net 的限制为 32768 时,OmniThreadLibrary 限制为 60 个线程?
我最近比较了 .NET 中的 OmniThreadLibrary 和 ThreadPool,我发现 Omni 在最大线程数方面受到更多限制——允许 60 个——而 .NET在 .NET 4.0 中可以达到32768 。
为什么会有这样的限制?
delphi - OTL - 按需终止任务
如何按需终止任务?当我这样做时:
主应用程序冻结。即使只有 1 个任务正在运行,我是在调试器外部还是内部运行它并不重要。
因为我不想将此代码放在任务中 30 次。令用户和程序员感到沮丧。
如果没有这个,应该有一种方法可以在全球范围内做到这一点。
delphi - 如何在一个任务组中使用超过 60 个任务?
如何在一个任务组中使用超过 60 个任务?我可以从 0 循环到 N 并创建任务,但这不会给我任何消息处理。我使用 OTL EventMontior 从任务发送消息..
我问的原因是因为使用 Indy 我被限制为 60 个请求。但是,如果我使用普通的 TThread,我不会遇到这些问题,但会遇到其他问题等。
.NET 线程池最大值:
- Framework 4.0(32 位环境)中的 1023
- Framework 4.0(64 位环境)中的 32768
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时间越多。
macos - 将多线程 Delphi 应用程序移植到 Mac:我的选择是什么?
我需要将应用程序(用 XE2 编写)移植到 Mac。
我的应用程序分为简单UI executable
(单线程)和不可见engine
(严重依赖 OmniThreadLibrary 3.02和Cromis 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 的最佳长期方法,且头痛最小
delphi - 如何从第二个线程更新进度指示器?
我有一个带有进度指示器的主表单。在数据模块中,我有十个数据集,每个数据集都定义了一个 OnBeforeOpen 事件。
我想通过主窗体中的进度条显示已打开数据集的进度百分比。
由于我对多线程编程完全陌生,有人可以给我一些建议吗?
非常感谢你
delphi - 如何将参数传递给 OmniThreadLibrary 中的 Parallel.Async()?
如何将一些参数从主线程传递到工作线程(即以下procedure
)?
如果检查IOmniTaskConfig
(在 OtlParallel.pas 中)的定义,则有一个commented out
名为 的属性Param
,如下所示:
所以我想我的问题的答案是否定的,但我希望不是!
delphi - 为什么 OmniThreadLibrary 的 ForEach 会阻塞主线程?
使用 OmniThreadLibrary 和 Delphi XE4,我希望在后台运行多个线程来处理数据,从而提高我现有代码的速度。
调用以下过程时,应用程序 GUI 将停止处理任何输入,直到所有线程都完成。我的理解是.NoWait
即使线程正在运行,使用也应该允许过程退出。
是不是我对 ForEach 循环的理解不正确,提示我应该使用另一种方法来实现后台处理?感谢您对正确使用 OmniThreadLibrary 的任何建议。