多线程修改VCL控件造成的ntdll.dll错

多线程修改VCL控件造成的ntdll.dll错 http://www.delphibbs.com/delphibbs/dispq.asp?lid=1574375问题:我调试老是提示:NTDLL.DLL出错线程中:Execute中调用一个写在线程单元的过程P,p执行完后调用Call过程,如下:procedureTDatav.Execute;begin if…..  begin    p;PP:

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用
 

http://www.delphibbs.com/delphibbs/dispq.asp?lid=1574375
问题

我调试老是提示:
NTDLL.DLL
出错
线程中:

Execute
中调用一个写在线程单元的过程
P ,p
执行完后调用
Call
过程
,如下:

procedure TDatav.Execute ;
begin
  if …..
    begin
       p ;
PP:    Exit ;
    end ;
  else
    …    
End ;

procedure p() ; //
线程单元中写着

begin
  … ;
  Call ;
end ;

procedure call(s1,r,re:string);//
线程单元中写着

begin
  Lock.Enter ;
  if FlagCS = ‘0’ then
  begin
    //

一个处理

  end else
  Begin
    Form1.Edit1.Text := … ;
  End;
  Lock.Free ;
end;


调用


procedure TForm1.Button1Click(Sender: TObject);
begin
  FlagCs := ” ;
  FlagCS := ‘1’ ;
  with TDatav.Create(Edit1.Text,Edit2.Text,Edit3.Text) do
  begin
    if Suspended then Resume;
  End ;
end;


第一次点击
Button1
没有错误,第二次点击时提示:
NTDLL.DLL
出错
,错误行为
PP



也就是 
Exit
那行


怎么办
??

回答:
call()
方法要用保护办法保护起来,一般来说只要你用了
VCL
可以显示的恐件的部分都要


用保护
sy*****
方法进行同步处理
!  
 
我用
TCriticalSection
同步了呀
,就那个
Lock

线程外
已经

  Lock := TCriticalSection.Create ;
创建了
,不过这个也是
Lock
也是


非线程单元的全局变量,是不是这儿错了
??
 
你如果调用
VCL
的可见恐件必须要用同步方法外包,或者用

API

函数
sendmessage
或者
postmessage
,否则要出问题,

DELPHI

的线程类生成的单元里有说明的
 
一般来说,
VCL
可视控件都不是线程安全的,非可视的基本都是,


这个问题论坛里有很多帖子讨论这个问题,你可以找来看看
 
TCriticalSection
只是对全局的数据比如变量进行保护,不能保护
VCL
类,尤其是有

strings

属性的
VCL
类,
即使只有一个线程,也不能在没有保护方法的线程方法里


创建窗体,否则要出错,我试过,就是
NTDLL
出错!
在线程里修改
VCL
可见控件不太稳定,有的时候出错,有的时候是好的,


所以
BORLAND
建议用保护方法
当然相信你的没错了
[:)]
,就是不明白为何两种同步的效果不同


还有,
synchronize(P) ,p
应该无参数,但我的那个过程
Call
要有三个参数
,怎么处理

synchronize(P)
方法根据不同的
DELPHI
版本,
DELPHI
用的是不同的处理方式,


不过都是利用消息队列进行
VCL
可视控件的同步,所以一般
VCL
可视组件要用

synchronize

同步,至于你的参数可以改成线程类的私有变量

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189759.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月9日 上午11:15
下一篇 2026年3月9日 上午11:43


相关推荐

  • 冷门的信息收集工具-genlist、nbtscan、xprobe2学习笔记

    冷门的信息收集工具-genlist、nbtscan、xprobe2学习笔记简介 最近在准备 中职技能大赛的 网络空间安全 所以没有学习什么新的知识 发这个是因为 最近看到湖南市 21 年的市赛的样题 发现好多没有学到的扫描工具 所以边学边记 加上很久没有发了 随便来 CSDN 做个笔记 本文使用 作为注释 一 genlist 简介 genlist 主要用于主机发现 很老了应该来说 不会考到不过了解一下也行 kali 好像没有 genlist 是在 BT5 做的 命令格式 genlist 参数 IP 用到的参数 s 网段扫描测试 ge

    2026年3月26日
    3
  • 分类结果评价指标——Kappa系数

    分类结果评价指标——Kappa系数kappa系数是用来衡量两个变量一致性的指标,如果将两个变量换为分类结果和验证样本,就可以用来评价分类精度了。计算公式如下:kappa=(Po-Pe)/(1-Pe)其中,Po是总体精度,Pe是偶然

    2022年7月2日
    35
  • CSS水平居中方法

    CSS水平居中方法水平居中行内元素首先看父元素是不是块级元素 如果是要实现水平居中 则直接给父元素设置 text align center style father text align center style body divclass father spanclass son 行内元素 amp l spanclass son divclass father body

    2026年3月16日
    2
  • DELL Eq PS4000服务器数据恢复过程/数据恢复案例

    DELL Eq PS4000服务器数据恢复过程/数据恢复案例DELLEqualLogicPS4000是戴尔为远程或分支办公室、部门和中小企业存储部署提供的存储服务器,可以提供企业级自动化、智能化性能服务,价格合理,管理和部署相对便捷,更适合中小企业及办公室需求,是中型企业级存储的起点…

    2022年6月15日
    31
  • javaSE和javaEE的区别?

    javaSE和javaEE的区别?JavaEE 是指 JavaEnterpri Java 企业版 多用于企业级开发 包括 web 开发等等 也叫 J2EE JavaSE 通常是指 JavaStandard Java 标准版 就是一般 Java 程序的开发就可以 如桌面程序 可以看作是 JavaEE 的子集 Java 是一问语言 J2EE 是 Java 语言的一门使用技术 Java 为 J2EE 提供了库和语法 J2EE 使

    2025年8月15日
    5
  • 数学的本质

    数学的本质数学的本质李国伟现代数学在方法上的特征现代数学在方法上最明显的特色是它的演绎性,就是由基本定义与公理出发,经逻辑推论到所有定理的发展方式。采取这种方法并非偶然,而是有内在的需求。我们要把一套概念讲清楚,必须用比较简单的概念来解释,但是这些概念又需要再加澄清,如此继续下去,如果不曾周而复始得到一个什么也说不清的恶性循环,便会无限延伸下去,达到一个不可知的前端。人类寻求知识的目的在组织自己

    2022年6月16日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号