多线程修改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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JS中动态删除对象中的某个属性[通俗易懂]

    letdog={name:”,age:""};console.log(dog);//{name:"",age:""}//删除当前dog对象中的age属性deletedog.age;console.log(do…

    2022年4月11日
    96
  • 三大战略分析方法——SWOT、PEST、波特五力模型

    三大战略分析方法——SWOT、PEST、波特五力模型目录1.SWOT分析模型「SWOT分析模型简介」「SWOT模型含义介绍」「SWOT分析步骤」2.PEST分析模型PEST分析的内容3.波特五力模型[定义][五力模型]1.SWOT分析模型「SWOT分析模型简介」(也称TOWS分析法、道斯矩阵)。在现在的战略规划报告里,SWOT分析应该算是一个众所周知的工具。来自于麦肯锡咨询公司的SWOT…

    2022年6月12日
    53
  • VMware的虚拟机连不上网

    VMware的虚拟机连不上网1.如果你发现在VMware下运行的虚拟机无法连接网络,那下面的方法也许可以帮到你。(前提是你的物理网络是通的)第一步:在VMware界面下单击“编辑“→”虚拟网络编辑器”第二步:单击”更改设置”获取权限,如果有。则不需要单击第三步:单击左下角的”恢复默认设置“,等待完成,然后确定退出。第四步:刚刚恢复默认后有两个,你自己…

    2022年6月26日
    21
  • 黑科技!仅需 3 行代码,就能将 Gitter 集成到个人网站中,实现一个 IM 即时通讯聊天室功能?[通俗易懂]

    黑科技!仅需 3 行代码,就能将 Gitter 集成到个人网站中,实现一个 IM 即时通讯聊天室功能?[通俗易懂]欢迎关注个人微信公众号:小哈学Java,文末分享阿里P8高级架构师吐血总结的《Java核心知识整理&面试.pdf》资源链接!!个人网站:"https://www

    2022年8月2日
    9
  • 如何将本地文件传到虚拟机linux_怎么把文件放到虚拟机里的系统里

    如何将本地文件传到虚拟机linux_怎么把文件放到虚拟机里的系统里一、使用FileZilla上传文件1.启动虚拟机,打开Linux终端,输入ifconfig命令查看IP地址IP地址为192.168.59.62.打开FileZilla,输入IP地址,用户名,密码,端口号,点击快速连接连接成功后,左边为本机资源目录,右边为虚拟机目录,左边选中文件,右键选择上传,即可上传成功二、使用SecureCRT或Xshell上…

    2022年8月22日
    191
  • ipfs是什么项目?filecoin怎么挖矿(filecoin的矿机有哪几家)

    如果考虑成为一个Filecoin矿工,首要需要清楚的是,挖矿收益主要来自三方面:区块打包奖励、数据存储收益、检索收益。1.区块奖励Filecoin网络拥有独特的经济设计,它可以使参与者之间的奖励保持一致,并奖励Filecoin矿工的有效工作。Filecoin经济的一个关键组成部分是区块奖励,这是对存储矿工的补贴,以提供可靠和有用的存储容量并维护Filecoin区块链。大多数区块链使用加密货币令牌奖励生产区块的矿工,以成功挖掘链中的新区块。Filecoin在这方面没有什么不同。Filecoin区块链通过连

    2022年4月14日
    49

发表回复

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

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