Delphi 10.2 匿名多线程TThread多开VCL同步卡死

Memoselect CSDN会员 Memoselect 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
TThread.CreateAnonymousThread(
procedure
begin
For I:=0 to 50000 do
begin
TThread.Synchronize(nil,
procedure
begin
Form1.Label1.Text:= I.ToString; //创建多个的时候这个依次修改label2、label3等等,这里简单写个过程
end);
end;
end).Start;
end;


以上方式我试过写两个过程或者多个过程,用此方法同时创建多个线程,遇到一个很严重的问题,创建单个线程没有问题,如果同时创建多个的话就会出现界面卡死,知道两个线程执行完毕后才显示到label1和label2上面,有玩过匿名线程的朋友可以说说这是什么问题吗?
当然,用以下方式也是一样的问题:
procedure TForm1.Button1Click(Sender: TObject);
var myThread:TThread;
begin
myThread:= TThread.CreateAnonymousThread(
procedure
begin
For I:=0 to 50000 do
begin
TThread.Synchronize(nil,
procedure
begin
Form1.Label1.Text:= I.ToString; //创建多个的时候这个依次修改label2、label3等等,这里简单写个过程
end);
end;
end);
myThread.Start;
end;

之前看过万一的博客,他只是简单介绍了如何创建匿名线程,至于Synchronize同步我是参照官方帮助文档来做的,不知道问题出在哪里。
如果直接继承TThread类来创建线程则没有问题

type
TmyThread = class(TThread)
protected
procedure Execute; override;
end;

procedure TForm1.Button1Click(Sender: TObject);
var myThread:TmyThread;
begin
myThread:= TmyThread.Create;
end;


以上这种方式则能正常的同步显示到多个label上。
这是TThread类匿名线程自身的问题还是我哪里操作错了?求解答,谢谢


...全文

相关推荐

delphi vcl线程同步synchronize

delphi vcl线程同步synchronize

ozhy111

Delphi用DOSCommand执行外部命令:从同步到异步的完整指南

在图形界面程序中执行外部命令行工具是常见需求,例如调用Git、FFmpeg或压缩工具。其背后涉及进程创建、标准输入输出重定向、管道读取等底层机制,若直接用ShellExecute或CreateProcess封装,往往会遇到死锁、界面卡死和编码乱码等棘手问题。一个成熟的解决方案是通过专用组件来管理进程生命周期和输出流。Delphi作为经典桌面开发工具,其生态中的DOSCommand组件正是为此设计。它封装了CreateProcess、管道重定向和异步线程读取,通过事件回调将实时输出传递给界面层,从而简化了同步

weixin_34013044

Delphi匿名线程中如何安全更新UI?TThread.Synchronize()保姆级教程

本文详细讲解了在Delphi匿名线程中安全更新UI的核心方法。针对VCL非线程安全的特性,重点剖析了TThread.Synchronize()和Queue()的工作原理、区别及适用场景,并通过实战代码演示了如何避免界面卡死和访问违规异常,确保后台任务与用户界面交互的稳定与流畅。

motor

Delphi医疗影像开发:Dicom.VCL控件集成、核心组件解析与疑难排错

在医疗影像软件开发领域,DICOM(医学数字成像和通信)标准是处理CT、MRI等影像数据的基础协议。其核心原理在于定义了一套统一的文件格式和网络通信规范,确保不同设备间的影像数据能够互通。这一标准的技术价值在于极大地促进了医疗信息的数字化与标准化,是构建PACS(影像归档和通信系统)、三维重建等高级应用的基础。在实际工程实践中,开发者常借助第三方控件来封装DICOM的复杂性,以加速应用开发。例如,针对Delphi平台的Dicom.VCL控件,就为快速构建具备DICOM图像查看、网络通信功能的应用程序提供了便

weixin_34146805

delphi多线程访问数据库

delphi如何用多线程访问数据库的例子

xunhacker2003
评论 18
收藏 已收藏
分享
返回顶部