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

multithreading - Delphi - 线程框架

我正在寻找在我的 Delphi 应用程序中使用的线程框架。

目前我正在评估 '<a href="http://otl.17slon.com/index.htm" rel="nofollow noreferrer">OmniThreadLibrary' - 到目前为止它看起来不错并且可以满足我的一切需求。

Delphi 还有其他“线程框架”吗?

(我正在使用 D2006 和 D2009)

0 投票
3 回答
1948 浏览

delphi - 使用 VirtualTreeview 和 OTL 的内存泄漏

我创建了一个小型多线程应用程序,我正在尝试将其转换为使用 OmniThreadLibrary。我正在使用 Virtualtreeview 来显示日志和状态/结果。Vst Log只有两列,记录只包含两个字符串字段(非常简单,记录内没有对象)。

使用 OTL 附带的 DEMO 项目(线程池 #11)我将项目更改为使用 VirtualTreeview 而不是列表框。当我从演示中“运行任务”时,没有内存泄漏,但如果我多次运行“运行任务”,就会发生内存泄漏。如果我多次运行任何任务,就会发生内存泄漏。如果我根本不使用 VirtualTreeView,任何时候都不会发生内存泄漏。就在我使用 VST 并且任务运行不止一次时。

我确实使用了 FreeNode 事件并清除了字符串,甚至尝试使用 Finalize ...

例子:

为什么在多次运行任务时会出现内存泄漏?Delphi 2010 与 FastMM4 最新的 Virtualtreeview 和 OTL

0 投票
2 回答
939 浏览

multithreading - 如何使用 OmniThreadLibrary 访问线程变量?

这似乎是一件容易的事,我只是不知道从哪种方式开始使用 OmniThreadLibrary:

我创建了一个在后台进行一些处理的任务。结果存储在任务类的字段中,并不断填充新值。

现在主线程想要不时读取这些字段并显示它们的值。
因此它需要访问这些字段并确保它们在这些时刻不被写入(同步)。

OmniThreadLibrary 如何做到这一点?

0 投票
1 回答
624 浏览

delphi - 是否可以在任务(OmniThreadLibrary)之间发送消息?

我的应用程序将具有用于各种操作的多个任务。
所有任务都在 FormCreate 中创建并在 FormDestroy 中终止,只要应用程序正在运行,它们就会一直运行。
主线程的唯一目的是处理用户 I/O 并将用户输入发送到适当的任务或接收要在主窗体中显示的任务信息。

将有必须在任务之间传输的数据。
示例:
我将让任务 A 进行数据处理。
它会将部分结果发送到主线程进行显示。
它还必须向任务 B 发送一些(其他)数据,任务 B 会将数据传输到另一台 PC。
任务 C 将从硬件设备接收一些数据,并将这些数据发送给任务 A 进行处理。
ETC...

据我所知,使用 OmniThreadLibrary 发送消息始终在任务和创建任务的线程之间(主线程和任务 A,或主线程和任务 B)。

如何在任意两个任务之间直接发送消息?

或者到目前为止我的方法有什么问题,应该完全不同吗?

0 投票
1 回答
457 浏览

delphi - IOmniWorker:Task 中执行的函数在哪里?

我正在创建一个 OmniWorker-Task 来进行一些数据处理。
到目前为止,该任务能够从/向其他任务接收和发送消息。

现在我需要实现这个任务的主要功能。该函数将连续运行并进行数据处理,而消息将修改其行为。

但是我把这个主要功能放在哪里呢?
对于 OmniWorker,是否有类似“执行”的方法需要实现?

0 投票
2 回答
1093 浏览

delphi - OmniThreadLibrary Overview

Is there a place where there is an introductory overview of the OmniThreadLibray for Delphi?

I have the current code installed in Delphi XE. The examples work. I've been looking over the associated The Delphi Geek blog with usage examples. Gabr admits the documentation does not exist. I would like to get a handle of the structure of the framework before diving into specific examples. I do have an understanding of the usage of TThread so I don't need go to a Threading 101 site.

The framework has shown to have a loyal following and I'd like to think I just haven't looked in the right place.

0 投票
4 回答
1411 浏览

multithreading - 多线程 WinHttp 下载

我正在创建一个 Delphi 应用程序来从 Internet 下载文件,如果服务器支持范围请求,它将是多线程的。进度也会传递回 GUI。

当前的软件模型使用TThread组件。GUI 调用 aTDownloadThread然后生成TDownloadPartThreads- 这些是实际通过“WinHttp”进行下载的线程。

我的问题:CPU 已经用完了,即使是一次下载,只有 4 个线程下载。

我推测的原因:

  1. 我每 8192 字节写入目标文件,想知道是否应该在写入一个块之前对其进行缓冲?
  2. 线程通信是通过Synchronize(MainForm.UpdateProgress(Downloaded, TotalSize))我听说的 AWFUL 来完成的,也许我应该在线程之间共享一个对象,这样我就可以使用主窗体上的计时器来访问它,以更新进度?

我的解决方案

  1. 错开文件写入,只写入每个x字节。

  2. 更新TThread要使用的组件OmniThreadLibrary并将数据以某种方式发送回主窗体。然后每个TDownloadPart线程将成为一个IOmniWorker并通过与主窗体共享一个对象来发回其进度。然后主窗体将使用计时器来更新其进度,例如:ProgressBar1.Position := sharedDataObject.Progress;

希望有人能指出我正确的方向!

0 投票
0 回答
1113 浏览

delphi - 在线程中使用datasnap ServerMethod返回的DataSet?

我正在使用 Omnithreadlibrary 从线程中调用服务器方法,数据成功返回,但我在使用返回的数据时遇到了麻烦,我尝试过的所有内容都与 AccessViolation 甚至应用程序崩溃有关,还尝试将数据集设置在链接到 ClientDataSet 的 DataSetProvider,但在这里它也不起作用,最后我将服务器方法设置为返回 OleVariant 并将其直接设置为 ClientDataSet 的 Data 属性,但我也有错误。

我的目的是让请求在线程中完成,并将数据返回到主线程中的函数以填充网格。

有什么建议么?

0 投票
5 回答
2776 浏览

multithreading - 如何实现使用最少资源定期检查某些内容的线程?

我想在后台运行一个线程,它将检查与给定时间间隔的某些服务器的连接。例如每 5 秒。

我不知道这是否有一个好的“设计模式”?如果我没记错的话,我在某个地方读到过它的执行方法中的休眠线程并不好。但我可能错了。

另外,我可以使用普通的 TThread 类或 OTL 线程库。

有任何想法吗?

谢谢。

0 投票
3 回答
438 浏览

multithreading - 对于这个项目,程序或面向对象哪个更好?

我一直在研究图像加载/缓存系统的许多试验/错误版本。作为 Delphi,我一直对面向对象编程感到满意。但是自从我开始实现一些多线程以来,我一直在想也许这个系统应该在程序的基础上工作。

为什么是因为这些进程将被踢到线程池中,执行图像的脏加载/保存,并释放自己。当我可以只使用过程/函数、记录、事件和图形时,我一直在尝试将这些线程进程包装在对象中。无需将其全部包装在一个类中,当它全部在一个单元内时……对吗?

现在我问的一个主要原因是因为这个系统是在单元的底部初始化的。使用 OmniThreadLibrary (OTL) 时,它已经有自己的初始化线程池,我什至不需要初始化我的线程池。

那么哪种方法更适合这个系统——包裹在一个对象中,或者只是在单元中运行,为什么?多线程的任何示例,而不是在对象内包装任何东西,而是在单元中?