在Thread中使用EnterCriticalSection更新VCL标签

2023-12-25

我是线程新手。我正在使用一个第三方库,该库使用线程,有时会调用我提供的过程。

当线程调用我的过程时,如何更新 TLabel.Caption?

如果我在其他地方调用了InitializeCriticalSection,它是否像

  EnterCriticalSection(CritSect);
  GlobalVariable := 'New TLabel.Caption';
  LeaveCriticalSection(CritSect);

然后在我的主线程中:

  EnterCriticalSection(CritSect);
    Label1.Caption:= GlobalVariable;
  LeaveCriticalSection(CritSect);

但是,如何让主线程代码被调用呢?线程可以使用SendMessage吗?或者是否有一些更好/更简单的方法(.OnIdle 可以检查线程设置的标志?)

Thanks.


关键部分用于序列化对一段代码的访问。对于更新图形用户界面,您应该注意只有主线程才应该更新 GUI 元素。

因此,如果您的线程需要更新 GUI 元素,它应该将其委托给主线程。为此,您可以使用不同的技术:

最简单的一种是在线程代码中使用 Synchronize 方法。当调用 Synchronize 时,您的线程将暂停,您提供给 Synchronize 的代码将在主线程的上下文中执行,然后您的线程恢复。

如果您不希望每次调用该代码段时线程都停止,那么您可以使用 Queue 方法。 Queue 将您的请求发送到目标线程(这里是主线程)的消息队列,因此您的线程不会停止,但 UI 可能不会立即更新,具体取决于主线程消息队列的拥挤程度。

实现此目的的另一种方法是使用 SendMessage 或 PostMessage API 函数将自定义 Windows 消息发送到主线程。在这种情况下,您必须定义一条自定义消息,并在需要更改 UI 元素时将其发送到主线程。您的主线程应该为该类型的消息提供一个消息处理程序,并处理收到的消息。结果与使用 Queue 方法类似。

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

在Thread中使用EnterCriticalSection更新VCL标签 的相关文章

  • Winform 没有.NET 框架?

    我必须创建一些表单并将其作为直接 EXE 提供 而不是安装程序 它安装 NET 框架 最终用户对此不满意 他们想要可以直接打开和工作的东西 我知道它可以作为网络完成 但我正在寻找 winforms 吗 请建议哪种工具 技术可以处理这个问题
  • 从单个应用程序中的多个线程调用 dll 函数是否安全?

    我正在 Delphi 2009 中编写一个服务器应用程序 它实现了多种类型的身份验证 每种身份验证方法都存储在单独的 dll 中 第一次使用身份验证方法时 会加载适当的 dll 仅当应用程序关闭时 DLL 才会被释放 在服务器线程 连接 之
  • 在 Delphi XE 中将类作为过程的参数传递

    我需要做的是这样的 procedure A type of form var form TForm begin form type of form Create application form showmodal freeandnil f
  • 如何确保超类的子类方法的线程安全?

    我参加了一次面试 并被要求为以下要求设计一个课程 假设我有一个 A 类 它可以有任意数量的子类 即子类 类 A 有一个名为 doSomething 的方法 该方法是同步的 要求是 A 的所有子类都是强制性的重写 doSomething me
  • Delphi XE 中的数据绑定向导 - 可以将其配置为映射到 MSXML 接口吗?

    Delphi XE 中的数据绑定向导生成继承自 Delphi 自己的 DOM ADOM XML v4 实现的类和接口 它似乎不支持针对模式进行验证 解析时验证 选项仅适用于 MSXML 供应商type 从 VCL 源代码以及 IDE 中 X
  • 如何使用 SyncAdapter 处理远程服务器的 RESTful 更新

    我观看了 Google I O REST 演讲并阅读了幻灯片 http www google com events io 2010 sessions developing RESTful android apps html http www
  • 在哪里可以找到有关 IOS 日历同步的优秀教程? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发 iPhone 应用程序 如何将新事件与 iOS 日历同步 您可以浏览此 github 代码
  • Delphi如何使用其他窗体中的类型?

    抱歉 这是一个非常新手的问题 我正在对这个庞大的应用程序进行维护 它有5种不同的形式 我们将全局变量放在一个单元 uGlobal 中 但我似乎无法从数据单元 uData 访问它 我有这个 Unit uGlobal type TmyType
  • 在 SQLite 数据库中存储日期时间值的最佳方式(Delphi)

    我将把日期时间值存储在 SQLite 数据库中 使用 Delphi 和 DISqlite 库 数据库的本质是它永远不需要在计算机或系统之间传输 因此互操作性不是一个限制 相反 我的重点是阅读速度 日期时间字段将被索引 我将对其进行大量搜索
  • 如何读取注册表项的默认值

    我有一个 Delphi XE2 项目来使用注册表项进行某些操作 所以我定义了以下代码 procedure TMainForm BitBtn01Click Sender TObject var RegistryEntry TRegistry
  • 关于java中同步的问题;何时/如何/到什么程度

    我正在开发我的第一个多线程程序 并在同步的几个方面陷入困境 我已经浏览了 oracle sun 主页上的多线程教程 以及这里的一些关于 SO 的问题 所以我相信我知道什么是同步 然而 正如我提到的 有几个方面我不太确定如何弄清楚 我以明确问
  • 我需要避免尝试更新连接到 TSQLQuery 的 Delphi TClientDataset 中的非物理字段

    概要 我的代码正在尝试更新 Delphi XE 中的非物理字段TClientDataset 连接到TSQLQuery以其SQL属性集 作为运行时的结果创建Open命令 我有一个TClientDataset连接到一个TDatasetProvi
  • 在 Delphi 2009 上安装最新版本的 Indy 10 [重复]

    这个问题在这里已经有答案了 是否有更新 Delphi 2009 中的 Indy 10 组件的分步指南 我读过正在卸载线程 https stackoverflow com questions 486210 what is the proper
  • 如何向标准集合编辑器添加图标?

    我有一个自定义控件 它利用TCollection and TCollectionItem 在集合编辑器中 我想向每个列表项添加图标 该列表项由内部TImageList 在其父组件内 集合项本身代表图标 我想在这个编辑器中显示相应的图标 如何
  • std::map 只读操作的线程安全

    我有一个 std map 用于将值 字段 ID 映射到人类可读的字符串 当我的程序在任何其他线程启动之前启动时 该映射会被初始化一次 之后就不会再被修改 现在 我为每个线程提供了这个 相当大的 映射的自己的副本 但这显然是内存使用效率低下
  • 查找Delphi项目中的所有编译错误

    我正在对我的 Delphi 项目进行一些重构 我希望能够做出改变 然后看看all项目中因该更改而中断的地方 类似于 Eclipse 列出项目的所有编译错误 在 Java 中 在 Delphi 中 我可以进行更改 然后重新编译我的项目 但编译
  • 调试器异常错误和内存超调

    我尝试运行以下代码 但它显示有关内存地址的错误 并显示一条消息 循环后 n 可能未定义 请看一看 var n max integer n integer r R1 f h0 Array of Real const h 0 00889 nip
  • 如何用不同的颜色绘制选定的列表框项目?

    是否可以更改 TListBox 中的项目选择焦点颜色和文本颜色 当项目中未启用主题或列表框样式设置为所有者绘制时 项目周围的选择将被涂成蓝色 我相信这是由系统的外观设置全局定义的 我想将所选项目的颜色更改为自定义颜色 举个例子 结果会是这样
  • 如何使用 FieldDefs 在运行时创建新的 SQLite 文件和表?

    我正在使用 Delphi Seattle 在全新的 SQLite 文件中创建一个全新的表 并且仅使用 FieldDefs 和非可视代码 我可以使用 ExecSQL CREATE TABLE 语法创建一个表 但不能如下所示 我得到 没有这样的
  • 如何在iOS的Delphi程序中使用IPv6协议

    我尝试在我的移动程序中使用 IPv6 协议 我的服务器位于 NAT 后面的 LAN 内 在服务器上我使用IP端口3000 我已经组织了从路由器端口 45500 到服务器端口 3000 的虚拟服务器 端口转发 在服务器上 我运行 ipconf

随机推荐

  • 如何以编程方式检测可用的 ssh 身份验证类型?

    我想编写一个监控插件来检查网络上的各个主机 以确保未启用密码或交互式 SSH 身份验证 也就是说 我需要编写以下代码 连接到 SSH 端口 枚举可用的身份验证方法 验证是否只能进行基于密钥的身份验证 使用 python 或 bourne s
  • 如何获取 Twitter API 列表中的所有用户?

    有没有办法访问列表中的所有成员 目前只能看到前20名会员 具体来说 我正在使用 python 和 tweepy 在 Tweepy 中 可以通过使用 Tweepy 提供的 Cursor 类来实现这一点 该类根据您所需的方法调用为返回给您的模型
  • ASP.NET MVC 3 RC 2 全球化客户端验证

    我的目标是根据用户的文化在客户端验证用户输入 我有一个具有以下结构的原始数据模型 public class User public int UserId get set Required StringLength 20 MinimumLen
  • 我们可以通过hiredis将C int数组设置为Redis中的键值吗?

    给定 int x 3 11 22 33 如何将其保存为键的值作为二进制数据并获取它 hiredis 给出了如何设置二进制安全字符串的示例 Set a key using binary safe API reply redisCommand
  • 无法在InitializeGL和paintGL之外调用OpenGL相关函数

    正如标题所示 在 Qt 内部 我无法使用或调用 QGLWidget 函数之外的任何 OpenGL 函数 例如initializeGL and paintGL 我正在尝试构建一个 3D 模型 在我的插槽之后QMainWindow类被称为 一切
  • JPA:设置参数后,如何获取/打印(类型化)查询后面的 JPQL 查询字符串?

    如何获取 打印 类型化 查询后面的 JPQL 查询字符串 即after参数已设置 例如用于调试目的 一个简单的toString 似乎没有做到这一点 Thanks 不存在 最终被转换为最终 SQL 的最终 JPQL 这样的事情 JPA 实现如
  • AWS RDS 的间歇性 SQL 连接问题

    目前 我们的 ASP NET 网站 基于 Sitecore 构建 遇到间歇性问题 该网站看似随机的 15 分钟内无法连接到 SQL Server 15 分钟后 问题自行解决 网站恢复正常 错误信息是 Exception System Dat
  • SAS proc sql返回group by/order by变量的重复值

    我有一些相当简单的 SQL 应该为每个资产每季度提供 1 行 相反 我每组得到多行 下面是 SQL SAS 数据步骤和一些输出数据 重复行数 在下面的数据中为 227708 等于 Num borrowers 即 asset1 的行数 pro
  • 为什么标签的高度比其内容大?

    我创建了一个小片段来说明问题 我有一个svg里面的图标 i 标签 这是我的图标的基本块 放置在我的页面的各个位置 为了这个示例 我将其放置在一个简单的 div 容器中 如果您检查下面示例的结果 您会发现 i 标签的高度为33px not 3
  • 在 PHP 中,函数是二进制安全的意味着什么?

    In PHP函数是什么意思binary safe 它们有何特别之处 它们通常用在什么地方 这意味着当您向函数传递任意二进制数据 即包含非 ASCII 字节和 或空字节的字符串 时 该函数将正常工作 例如 非二进制安全函数可能基于需要空终止字
  • 在 MongoDB 中执行 JavaScript 文件

    我想知道如何在 MongoDB 中执行 JavaScript 文件 这是我的 JS 文件中的一段简单代码 function loadNames print name 从命令提示符我尝试像这样执行文件 mongo test js 但它显示错误
  • 如何限制Go中实现的HTTP服务器的连接数?

    我正在尝试在 Golang 中实现 HTTP 服务器 我的问题是 我必须将任何特定时间的最大活动连接数限制为 20 您可以使用netutil LimitListener https godoc org golang org x net ne
  • jQuery 滑块作为时间线

    我刚刚完成了 jQuery 手风琴与 jQuery 滑块的合并 IE 显示 3 张图片 用户可以使用PREV or NEXT按钮可查看下一张 上一张 3 张图像 他们还可以使用滑块浏览所有图像 下一步是使这个滑块看起来像时间线 左侧需要从
  • 我应该使用哪个(对于基于 python 的网站)? sass、compass、switchcss...替代品? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 组织 CSS 的最佳系统是什么 我正在制作几个使用 python 作为后端脚本的网站 我有兴趣使用一些东西来帮助我组织长 css 脚本 我
  • 使用 Jackson 反序列化包装列表

    我有一个像这样的 JSON 对象 geonames countryId 2017370 adminCode1 73 countryId 2027370 adminCode1 71 我怎样才能反序列化这个对象DIRECTLY to List
  • 如何在 Spring 应用程序上下文中将 Class 设置为属性值?

    有没有办法配置 spring 应用程序上下文 以便它将使用 Class 类型的值初始化 setter 我需要初始化该结构 Map
  • 将 RTSP 流转换为虚拟网络摄像头

    我正在尝试使用来自 IP 摄像机的 RTSP 流作为 Windows 上各种应用程序 例如 Skype Zoom Microsoft Teams 等 的视频输入源 到目前为止我找到的唯一解决方案是使用 webcam 7 http www w
  • std::weak_ptr:锁或shared_ptr构造函数?

    似乎有两种方法可以暂时获取 a 所指向的资源的所有权weak ptr Use lock 通过weak ptr to a shared ptr构造函数 这两者都会产生一个shared ptr 锁返回一个nullptr在这种情况下weak pt
  • 动态设置线性布局背景

    我想通过以下方式动态设置线性布局背景 通过 XML 解析从 Web url 获取图像 然后将该图像存储到 SD 卡中 现在图像已保存到 SD 卡中 将该图像设置为应用程序中的线性布局背景 现在我陷入了第三步 有人可以帮忙吗 用这个 Bitm
  • 在Thread中使用EnterCriticalSection更新VCL标签

    我是线程新手 我正在使用一个第三方库 该库使用线程 有时会调用我提供的过程 当线程调用我的过程时 如何更新 TLabel Caption 如果我在其他地方调用了InitializeCriticalSection 它是否像 EnterCrit