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


相关推荐

  • 并发框架disruptor_ringbuffer的常规用法

    并发框架disruptor_ringbuffer的常规用法Disruptor概述子主题1生产者消费组框架子主题2使用子主题11.建Event类(数据对象)2.建立一个生产数据的工厂类,EventFactory,用于生产数据;3.监听事件类(处理Event数据)4.实例化Disruptor,配置参数,绑定事件;5.建存放数据的核心RingBuffer,生产的数据放入RungBuffer。ringbuffer它…

    2022年9月11日
    0
  • 编译QCAD_qt 编译

    编译QCAD_qt 编译开源二维CAD程序QCAD的编译说明。

    2022年8月4日
    3
  • mediumtext_【紧急求助】关于mediumtext类型数据的调用

    mediumtext_【紧急求助】关于mediumtext类型数据的调用你的位置:问答吧->PHP基础->问题详情【紧急求助】关于mediumtext类型数据的调用请问各位大大,我如何将mediumtext类型的数据调用输入textarea文本框中呢?主要的问题是mediumtext内没有回车完全可以正常调用,但一旦有回车就无法进行调用,文本框中输入不了任何数据!恳请各位大大不…

    2022年6月12日
    26
  • 不是单组分组函数

    不是单组分组函数问题:一:SELECT tablespace_name, SUM(bytes) freeFROM dba_free_space不是单组分组函数原因: 1、如果程序中使用了分组函数,则有两种情况可以使用:程序中存在group by,并指定了分组条件,这样可以将分组条件一起查询出来改为:  SELECT tablespace_name, SUM(bytes) freeFROM dba_free_spa…

    2022年6月30日
    33
  • throw 和 throws 的区别?

    throw 和 throws 的区别?throw和throws的区别?throw:表示方法内抛出某种异常对象 如果异常对象是非RuntimeException则需要在方法申明时加上该异常的抛出即需要加上throws语句或者在方法体内trycatch处理该异常,否则编译报错 执行到throw语句则后面的语句块不再执行throws:方法的定义上使用throws表示这个方法可能抛出某种…

    2022年10月24日
    0
  • Response.Write具体介绍

    Response.Write具体介绍

    2021年12月8日
    38

发表回复

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

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