多线程修改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

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

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Promise用法及使用案例

    Promise用法及使用案例想了解更多方法请参考阮一峰老师的教程:http://es6.ruanyifeng.com/#docs/promise1.Promise的含义Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理更强大。所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操…

  • 充分不必要条件和必要不充分条件的意思_怎么区分充分必要条件

    充分不必要条件和必要不充分条件的意思_怎么区分充分必要条件转载:https://www.zhihu.com/question/30469121充分条件:只要有A,就一定能达成B,A是B的充分条件。充分不必要条件:有A,一定能达到B;就算没有A,也有可

  • springboot 之 使用jasypt加密解密插件[通俗易懂]

    springboot 之 使用jasypt加密解密插件[通俗易懂]简单使用jasypt是一个java实现的安全框架1、该工具支持注解方式开启jasypt功能,以及注解方式引入一个或多个需要处理的配置文件。 2、该工具同时支持properties与yml文件的解析处理。 3、该工具支持自定义加解密类型和复写加解密方法。引入插件<dependency> <groupId>com.github.ulisesbocchio&…

  • kafka集群搭建及简单使用

    kafka集群搭建及简单使用KafkaKafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Li…

  • clion2021激活码【最新永久激活】

    (clion2021激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html9ZHRNTE33T-eyJsa…

  • Python解释器以及PyCharm的安装

    Python解释器以及PyCharm的安装通过CSDN上,大神写的教程,安装了PyCharm,现自己总结Python解释器安装以及PyCharm安装过程。一、Python解释器安装解释器(英语:Interpreter),又译为直译器,是一种电脑程序能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每转译一行程序叙述就…

发表回复

您的电子邮箱地址不会被公开。

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