Delphi线程等待数据,处理它,然后恢复等待

2023-11-23

我需要在Delphi中创建一个具有以下特征的线程:

  • 等待主线程将数据添加到共享队列。
  • 处理队列中的所有数据,将结果返回到主线程(对于最后一部分,我将仅将消息发送到主窗口)。处理非常耗时,因此当工作线程处理先前的条目时,可能会将新数据添加到队列中。
  • 恢复等待,使用尽可能少的 CPU 周期。

我无法向线程发送消息,因为它没有窗口句柄。

我应该使用 WaitForObject 的某种变体吗?如果是这样,还等什么?如果没有,那么我怎样才能让线程等待,然后在新数据进入队列时唤醒它?

我读了多线程 - Delphi 方式,这似乎没有回答我的问题。也许全线程库可以做我需要的事;我无法判断,因为文档很少。我对线程了解不够,无法弄清楚该库是否会在这里提供帮助以及如何使用它(甚至为什么要使用它而不是仅仅使用 TThread 后代)。


OmniThreadLibrary 绝对可以在这方面为您提供帮助。 OTL 发行版中的测试 5 应该可以帮助您入门。

在此演示中,“开始”按钮创建线程并设置一些参数和计时器(如果不需要,您可以在代码中删除它们)。 “更改消息”向线程发送一条消息,该消息在线程的 OMChangeMes​​sage 方法中进行处理。然后,线程将一些信息发送回客户端(本演示中为 OMSendMessage,但您可以在您将在其中执行工作的同一消息中执行此操作),主线程通过 OmniEventMonitor 组件接收此消息。 “停止”按钮停止工作线程。

如果在您的线程繁忙时有更多消息到达,它们将在您的工作方法完成其工作后立即排队并进行处理。当无事可做时,线程将使用进程中的零 CPU 周期等待下一条消息。

EDIT

在 Delphi 2009 及更高版本中,后台工作者模式提供了一个更简单的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi线程等待数据,处理它,然后恢复等待 的相关文章

  • 作为属性的类引用

    谷歌对于这类搜索毫无用处 因为你会得到数亿个结果 其中没有一个与特定问题相关 问题很简单 Delphi 中是否可以有类引用属性 如果是这样 怎么办 这是我尝试过的 type TMyObject class end TMyObjectClas
  • Thread.Sleep 是否会妨碍其他线程?

    这是一个控制台程序 希望 10 个线程批量启动 等待 5 秒 然后批量停止 static void Main string args System Threading Tasks Parallel For 0 10 index gt Act
  • Firemonkey - 更新视觉组件

    我们从版本 1 开始就使用 Firemonkey 但仍然发现更新当前在屏幕上可见的组件很困难 在 Firemonkey 中请求重画的 方式 有很多 也许太多了 应用样式 ApplyStyle 事件 主要是当它在屏幕上可见时 请求 repai
  • 是否可以从父线程访问/更新子线程的资源?

    我正在用 C 语言进行套接字编程 并且对多线程完全陌生 这是我的场景 我需要一个父线程从套接字读取数据 可以说 并将其排队到其子线程的队列中 这里的问题是 如何更新子线程的队列 具体来自父线程 支持多个生产者和消费者的线程安全队列 MtQu
  • 启动时系统托盘图标不出现

    我在 FormCreate 事件处理程序中使用以下代码来创建系统托盘图标 当我运行程序时 系统托盘图标显示正常 我将应用程序设置为在 Windows 启动时自动启动 当我重新启动计算机时 我的应用程序进程已启动 但系统托盘图标从未出现 我认
  • bash while 循环线程

    我有一个 while 循环读取来自 a 的行 hosts while read line do ip line check done lt hosts 我的问题是我可以使用某种方法来加快速度 或者一次在 10 个主机上运行检查 每个检查都在
  • 多线程文件写入

    我正在尝试使用多个线程写入大文件的不同部分 就像分段文件下载器所做的那样 我的问题是 执行此操作的安全方法是什么 我是否打开文件进行写入 创建线程 将 Stream 对象传递给每个线程 我不希望发生错误 因为多个线程可能同时访问同一个对象
  • C#中为什么需要锁和对象?

    这是我一直不明白的事情 创建一个虚拟对象几乎看起来像是一个黑客locked 就像例子一样 class Account decimal balance private Object thisLock new Object public voi
  • async-await 如何“节省线程”?

    我知道使用无线程异步有更多线程可用于服务输入 例如 HTTP 请求 但我不明白当异步操作完成并且需要一个线程来运行它们时 这如何不会潜在地导致线程饥饿继续 假设我们只有 3 个线程 Thread 1 Thread 2 Thread 3 并且
  • 僵局澄清?

    也许对 死锁 还有其他解释 但据我所知 当发生死锁时两个线程各自等待一个资源 另一个 所以两者都无法继续 但我在这里看到了几个答案 它们声称长时间的等待 不互相等待 也是一个僵局 例子 1 https stackoverflow com a
  • 如何修复 Delphi Prism ASP.NET 错误:“解析器错误消息:‘Oxygene’不是受支持的语言”

    我在 Delphi Prism 中编写了一个 ASP NET Web 应用程序 不是网站 在我的开发机器上一切正常 但是当我将其安装在测试服务器上时 出现以下错误 Server Error in MyApp Application Pars
  • 数百个空闲线程的影响

    我正在考虑使用可能数百个线程来实现通过网络管理设备的任务 这是一个在带有 Linux 内核的 powerpc 处理器上运行的 C 应用程序 在每个任务进行同步以将数据从设备复制到任务的初始阶段之后 任务变得空闲 并且仅在收到警报或需要更改一
  • C#代表,参考解析时间

    我有一个关于 net 代表的简单问题 假设我有这样的事情 public void Invoke Action
  • C# - 如何检测 SQLite DB 是否被锁定?

    我正在开发一个使用 SQLite 的多线程 C 程序 我遇到一个问题 有时运行 SQLiteCommand ExecuteNonQuery 来更新某些行会抱怨 SQLite 错误 5 数据库已锁定 我知道发生这种情况是因为数据库在插入或更新
  • 多线程应用程序的调用方法?

    我的应用程序中有一个错误 与here http forums ni com t5 Measurement Studio for NET Waveform Graph quot X quot Error m p 217817 highligh
  • Indy FTP 传输类型

    我正在使用 IdFTP Indy 10 组件从远程位置下载一些文件 zip 和 txt 在获取每个文件之前 我将 TransferType 设置为二进制 IdFTP TransferType ftBinary IdFTP Get ASour
  • 我如何在 C++ 中将数组存储到队列

    queue lt int gt qq for int i 0 i lt N i int cc 2 i i 1 qq push cc N很大但不精确 所以我想使用队列 我想存储很多数组来排队 但是 qq 存储的数组是同一个 我该怎么做 你的代
  • 如何通过pthreads管理两个或多个消费者?

    我有一个正在寻求解决的通用问题 即从标准输入或常规文件流发送到应用程序的二进制数据块 应用程序又将二进制数据转换为文本 使用线程 我想在将文本传输到下一个应用程序之前对其进行处理 该应用程序会进一步修改该文本 依此类推 作为一个简单的测试用
  • Pygame - 如何使 hitbox 与敌人的移动一起工作?

    我正在用 Pygame 制作一个 Python 游戏 目前正在研究 hitbox 程序应该暂停 设置play False 每当玩家与敌人碰撞时 只有当我注释掉所有敌人的移动 第 56 64 行 时它才 有效 但这显然不是最好的选择 我读过有
  • EIdOSSLUnderlyingCryptoError 和“使用 SSL 连接时出错。错误:14094410...”

    我在 OS X 上的 Delphi 10 1 Berlin 中遇到 Indy 组件问题 我正在使用TIdHTTP使用 HTTPS 连接到 Web 服务 问题是从 OS X 客户端连接到服务器 在 OS X 上运行时 我总是遇到同样的错误 P

随机推荐

  • 闪亮的反应性

    我有一个带有大量参数的应用程序 每个参数都有很多粒度 这使得找到所需的参数变得很痛苦 这会导致反应部分不断计算 从而减慢速度 我添加了一个提交按钮 它解决了上述问题 但随后又遇到了另一个问题 下面是我构建的框架的简单复制 参数输入接受1到1
  • PowerShell函数参数语法

    为什么要这样做写主机函数外部的工作方式与函数内部的工作方式不同吗 似乎参数变量以某种方式与我声明的内容发生了变化 function a string svr string usr x svr usr Write Host x svr abc
  • 查询对象实现示例[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 任何人都可以推荐有关 C Java 中查询对象模式使用的优秀教程 实现或示例代码吗 我用谷歌没有找到太多 由于 LINQ 几乎无处不在 您确定需要重
  • cmake的默认构建配置是什么

    In this答案 它说 Debug 是默认的 cmake 构建配置 但我有不同的观察 我在 CMakeLists txt 中有以下内容 可以根据当前的构建配置选择库的调试和发布版本 target link libraries MyApp
  • 找不到有角度的自定义管道

    在我的应用程序中 我需要全局自定义管道 我尝试按照以下方式实现它角管但我总是看到这个错误 模板解析错误 找不到管道 formatdate 格式化日期 管道 import Pipe PipeTransform from angular cor
  • Java USSD 菜单树生成 - 如何

    我想使用 Java 生成一个基于树的菜单 该菜单将显示在 USSD 浏览器上 每个节点可能有子节点 以叶节点结尾 我还必须维护访问此菜单的每个用户的状态 例如他在菜单上的当前位置 以方便导航 关于如何实现树生成和状态管理有什么想法吗 我假设
  • 在 OSX 上安装 Jekyll 需要 GCC 吗?

    Jekyll 安装 says GCC 和 Make 如果您的系统没有安装它们 您可以通过在系统的命令行界面中运行 gcc v 和 make v 来检查 我正在使用 macOS Sierra 我已经安装了 Xcode 的命令行工具 CLT 和
  • 如何向 C++ 程序添加定时延迟?

    我正在尝试在 C 程序中添加定时延迟 并且想知道是否有人对我可以尝试的内容或我可以查看的信息有任何建议 我希望我有更多关于如何实现这个定时延迟的细节 但是在我有更多关于如何添加定时延迟的信息之前 我不确定我应该如何尝试实现这个 C 11 的
  • 从程序集中删除签名

    我在 Visual Studio 中打开了一个项目 它恰好是 Enyim Caching 该程序集希望延迟签署 事实上 它如此强烈地希望延迟签名 以至于我无法强制 Visual Studio 编译它without延迟签字 我已取消选中 Vi
  • PHP 错误:“zip 扩展名和解压缩命令均丢失,正在跳过。”

    当我运行composer update我收到此错误消息 Loading composer repositories with package information Updating dependencies including requi
  • 如何在 woocommerce 中获取当前用户的所有订单

    我想获取当前用户在插件函数中发出的所有订单 我正在使用这个 function get all orders customer orders get posts apply filters woocommerce my account my
  • 如何将 ng-repeat 放入 ng-repeat 中 n 次

    I have a JSON object having nested nodes which can go on for any number of level I need to display the content of a node
  • 反射会带来什么风险? (中等信任度)

    中等信任托管环境中缺乏反思似乎造成很多问题适用于许多流行的 Web 应用程序 Why is 反射权限默认情况下禁用中等信任 反射在共享托管环境中会带来什么风险 随机参考 参见MSDN 如何在 ASP NET 2 0 中使用中等信任 反射允许
  • Django <-> SQL Server 2005,文本编码问题

    我正在尝试使用以下方法在 MS SQL Server 2005 上存储 Django 数据 http code google com p django pyodbc pyodbc FreeTDS 只要我存储由 ASCII 字符组成的字符串
  • 使用 CABasicAnimation 对帧属性进行动画处理

    我正在尝试对此进行精确的 翻译 UIView基于块的动画代码 UIView animateWithDuration 0 5 delay 0 0 options UIViewAnimationOptionCurveEaseInOut anim
  • 如何从 SQL Server 上的一张表中删除 8,500,000 条记录

    删除活动 其中 unt uid 为 null 将是最快的方法 但在该语句完成之前没有人可以访问数据库 表 因此这是不行的 我定义了一个游标来在工作时间完成此任务 但无论如何对生产力的影响很大 那么如何删除这些记录才能保证这个数据库的正常使用
  • 如何计算弹跳角?

    我玩了一段时间 但我就是想不通 我做了一个发射导弹的坦克 当导弹击中墙壁时 我希望它们弹开 但我希望它们弹回正确的角度 现在我没有任何障碍物 导弹一超出范围就会弹开viewportRectangle I made 我正在寻找的解决方案相当先
  • 如何自定义WebRTC视频源?

    有人知道如何更改WebRTC https cocoapods org pods libjingle peerconnection 视频来源 我正在开发一个屏幕共享应用程序 目前 我在 CVPixelBuffer 中实时检索渲染的帧 有人知道
  • 如果CHAR_BIT != 8,其他类型的大小是多少?

    C 标准要求sizeof char to be 1 无论实际需要多少位 其他数据类型是否以以下方式衡量 bytes or chars万一这些不一样呢 基本上 假设CHAR BIT is 16 would sizeof int16 t 等于1
  • Delphi线程等待数据,处理它,然后恢复等待

    我需要在Delphi中创建一个具有以下特征的线程 等待主线程将数据添加到共享队列 处理队列中的所有数据 将结果返回到主线程 对于最后一部分 我将仅将消息发送到主窗口 处理非常耗时 因此当工作线程处理先前的条目时 可能会将新数据添加到队列中