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


相关推荐

  • JDBC连接MySQL数据库及演示样例

    JDBC连接MySQL数据库及演示样例

    2021年12月8日
    50
  • IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结

    IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结IntelliJIDEA使用教程(总目录篇)首先,使用的时候,自己得先在电脑上安装个小乌龟。也就是svn啦。第一步安装小乌龟。如下:具体安装好像没什么具体要求,一路next,就好。如上图箭头所示,在安装TortoiseSVN的时候,默认commandlineclienttools,是不安装的,这里建议勾选上。这个我不确定我当时选没选,不过呢,你给安装…

    2022年5月15日
    94
  • Rectified Linear Unit_激活函数图像

    Rectified Linear Unit_激活函数图像传统Sigmoid系激活函数传统神经网络中最常用的两个激活函数,Sigmoid系(Logistic-Sigmoid、Tanh-Sigmoid)被视为神经网络的核心所在。从数学上来看,非线性的Sigmoid函数对中央区的信号增益较大,对两侧区的信号增益小,在信号的特征空间映射上,有很好的效果。从神经科学上来看,中央区酷似神经元的兴奋态,两侧区酷似神经元的抑制态,因而在

    2025年6月30日
    3
  • html标签<td><tr><th>全称及缩写说明[通俗易懂]

    html标签<td><tr><th>全称及缩写说明[通俗易懂]<td>是tabledatacell的缩写,单元格<tr>是tablerow的缩写,表格中的一行<th>是tableheadercell的

    2022年8月2日
    7
  • java集合类面试题

    java集合类面试题java集合类面试题1.请聊一下java的集合类,以及在实际项目中你是如何用的?注意说出集合体系,常用类,接口,实现类加上你所知道的高并发集合类,JUC在实际项目中引用,照实说就好了2.集合类是怎么解决高并发中的问题?线程非全的集合类ArrayListLinkedListHashSetTreeSetHashMapTreeMap实际开发中我们自己用这样的集合最多,因为一般我们自己写的业务代码中,不太涉及到多线程共享同一个集合的问题线程安全的集合类VectorHashTable

    2022年7月9日
    21
  • Red Hat

    Red Hat

    2021年10月8日
    53

发表回复

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

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