SWT中使用线程后,要改变面板中某个控件的值,报 thread invalid access错误

最近一直在帮别人调SWT项目的错误,觉得这个错误有必要记下来……

在console中发现是这个错误,我们可以进行如下判断:

1、从console中点击到swt底层代码,会发现,给控件setText()时, setText()方法会调用checkWidgt()方法,

2、checkWidgt()方法会判断现在使用的线程是否是打开面板时的线程,

3、所以,在方法中调用了线程,而线程又要给某个面板中的控件setText()时,就要异步调用setText()。

Display.getDefault().asyncExec(new Runnable(){//在新线程中访问主线程main中的组件,必须使用异步调用方案
                public void run(){
                    EmailChecking.label_1.setText(time);
                    }
 });


我们来看个例子:

                    //发邮件操作
                    SendEmailUtil email=new SendEmailUtil(true);
                    
                    yzm=email.send("13298581430@163.com",toAddr,null);
在send()方法中,调用了新的线程。




新线程中的run()方法:

public void run() {
        // 设置日期2012-12-21
        Calendar c = Calendar.getInstance();
        c.set(2012, 12, 21, 0, 0, 0);
        // 单独设置年、月、日、小时、分钟、秒
        c.set(Calendar.YEAR, 2012);
        c.set(Calendar.MONTH, Calendar.DECEMBER); // 0 表示1月,11 表示12月
        c.set(Calendar.DAY_OF_MONTH, 21);
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);

        // 获取2012-12-21 0:0:0时间点对应的毫秒数
        long endTime = c.getTimeInMillis();
        // 获取系统当前时间
        Date now = new Date();
        // 获取当前时间点对应的毫秒数
        long currentTime = now.getTime();

        // 计算两个时间点相差的秒数
        long seconds = (endTime - currentTime) / 1000;

        seconds=10;
        boolean flag=true;
        while (flag) {
            final String time="还剩: " + seconds + " 秒";
            Display.getDefault().asyncExec(new Runnable(){//在新线程中访问主线程main中的组件,必须使用异步调用方案
                public void run(){
                    //label.setText(df.format(date));
                    EmailChecking.label_1.setText(time);
                    isTimeOut=true;
                    }
                });
        
                seconds--;
                if(seconds==-1){
                flag=false;
                
                
                }
                
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        }
        isTimeOut=false;
    }



在OPNET中进行网络建模和仿真时,经常遇到Invalid Memory Access错误,这类问题往往是因为内存管理不当或指针使用错误引起的。要解决这一问题,可以参考这份资料:《OPNET仿真指南:解决Invalid Memory Access错误与建模技巧》。该资料将指导你如何设置和调试OPNET仿真环境,具体操作步骤如下: 参考资源链接:[OPNET仿真指南:解决Invalid Memory Access错误与建模技巧](https://wenku.youkuaiyun.com/doc/7vnre7nrm7) 首先,在进行网络模型设计前,确保你对OPNET Modeler的界面和工具有一个基础的认识。手册第1章将为你提供必要的入门知识,并展示如何定义网络拓扑。 接下来,设置仿真环境,包括必要的配置和参数设置。在构建网络模型时,特别注意内存的分配和指针的使用,避免出现空指针或悬挂指针的情况。如果在仿真过程中遇到Invalid Memory Access错误,可以采取以下措施进行调试: 1. 调整编译选项,加入/Od、/Zi和/DEBUG字段,这有助于生成调试信息并禁用优化,以简化错误跟踪。 2. 禁用Visual C++(VC)的异常处理,这样可以在发生异常时直接进行调试,而不是由异常处理器接管。 3. 利用仿真工具如ODB(OPNET Debugger)进行联合调试,设置断点,逐步执行代码,观察内存访问上下文,找到错误发生的具体位置。 在仿真规模较大或系统较为复杂时,建议从简单网络模型开始,逐步增加复杂性,这样有助于定位和解决 Invalid Memory Access错误。 通过上述方法,你将能够有效地解决在使用OPNET进行网络仿真时遇到的Invalid Memory Access问题,并在仿真过程中进行有效的内存管理和错误排查。 在解决了Invalid Memory Access错误之后,如果你希望深入学习网络建模和仿真的高级技巧,推荐继续研读《OPNET仿真指南:解决Invalid Memory Access错误与建模技巧》。这份资料不仅提供了错误解决的方法,还包括了网络建模的深入讲解,能够帮助你进一步提升在网络规划和通信系统仿真方面的能力。 参考资源链接:[OPNET仿真指南:解决Invalid Memory Access错误与建模技巧](https://wenku.youkuaiyun.com/doc/7vnre7nrm7)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值