急!VB不能正确初始化变量

liaohao0101 2018-05-01 09:43:24
VB6程序窗体加载的时候要初始化2000多个Opc变量,这些变量从Opc服务器中读取。这些变量初始化完毕以后我在日志里打印,发现这些变量系统都生成了句柄,也就是说全部都初始化了。但是只有前面的一部分变量有值,后面的变量值都是0,而实际的opc变量值不是0。我按照百度的方法在循环的方法中添加了Doevents语句,又带来了新的问题,程序关闭后在内存中的进程结束不了。大侠们帮我想想办法怎样才能让这2000个变量都能够正确初始化。
...全文
1074 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
liaohao0101 2018-05-11
  • 打赏
  • 举报
回复
引用 29 楼 zhao4zhong1 的回复:
[quote=引用 28 楼 Chen8013 的回复:] [quote=引用 27 楼 chewinggum 的回复:] [quote=引用 26 楼 zhao4zhong1 的回复:] 我一般不贴对楼主没用的代码。
此言不假,你只贴没用的文字[/quote] 妙 ………… [/quote] [/quote] 你的方法我觉得可行,有条件我试一下
熊孩子开学喽 2018-05-04
  • 打赏
  • 举报
回复
改结构吧, 楼主这样写是不行的, 调试复杂, 功能也乱. 很久以前我做过一个类似的, 给你个思路: 写两个程序: 第一个是专门用于和下位机打交道的程序A, 它负责拿数据. 拿到整套数据就放入"可用"的数据交换区. 直到下一套完整数据获取完成再替代. 数据有效性校验也在这里完成. 第二个程序就是上位机界面和数据处理的程序B, 它只从A拿数据, 然后各种人机互动和处理. A和B你可以自己设计沟通方式, 比如触发式或者查询式, 数据交换方式也可以自己设计, 方法多的是. 这样的好处显而易见, 调试简单, 上位机部分你甚至可以杜撰一些数据喂给它看结果. 下位机拿到的数据你也可以调出来看. 根本不存在因为便秘而导致呕吐的奇怪问题.
赵4老师 2018-05-03
  • 打赏
  • 举报
回复
我一般不贴对楼主没用的代码。
赵4老师 2018-05-03
  • 打赏
  • 举报
回复
引用 28 楼 Chen8013 的回复:
[quote=引用 27 楼 chewinggum 的回复:] [quote=引用 26 楼 zhao4zhong1 的回复:] 我一般不贴对楼主没用的代码。
此言不假,你只贴没用的文字[/quote] 妙 ………… [/quote]
舉杯邀明月 2018-05-03
  • 打赏
  • 举报
回复
引用 27 楼 chewinggum 的回复:
[quote=引用 26 楼 zhao4zhong1 的回复:] 我一般不贴对楼主没用的代码。
此言不假,你只贴没用的文字[/quote] 妙 …………
脆皮大雪糕 2018-05-03
  • 打赏
  • 举报
回复
引用 26 楼 zhao4zhong1 的回复:
我一般不贴对楼主没用的代码。
此言不假,你只贴没用的文字
赵4老师 2018-05-02
  • 打赏
  • 举报
回复
注释掉所有On Error Resume Next语句,在VB6 IDE中运行, 出错后点击调试,光标会停在出错的那条语句处, 或者 事先在怀疑可能有逻辑错误的语句处设置断点,运行经过断点时中断, 此时可以在立即窗口中使用 ?变量名 或 ?函数名(函数参数) 或 过程名(参数) 辅助调试。
liaohao0101 2018-05-02
  • 打赏
  • 举报
回复
引用 1 楼 Chen8013 的回复:
不知道你的具体细节,不好说………… 2千多个,还要通过“网络”获取信息,要知道网络总会有“延迟”的,这启动过程得多久啊…… 你是不是应该考虑一下“架构”设计了?
程序是从本机取数据的
liaohao0101 2018-05-02
  • 打赏
  • 举报
回复
引用 2 楼 chewinggum 的回复:
2000多个是一个一个取还是一口气取下来然后再初始化?
是一个一个取的

        Dim KepItem As OPCItem
        Dim lServerHandles() As Long
        Dim item As SHItem
        Set item = New SHItem
        Set KepItem = KepItems.AddItem(HeadSuffix & ".RcpSel", 101)
        item.ShRS = KepItem.ServerHandle
        lServerHandles(temp + 2) = KepItem.ServerHandle
        Set KepItem = KepItems.AddItem(HeadSuffix & ".StatusFlag", 102)
        item.ShSF = KepItem.ServerHandle
        lServerHandles(temp + 3) = KepItem.ServerHandle
        'WriteErrLog "KepManage", "Init", "step7"
        Set KepItem = KepItems.AddItem(HeadSuffix & ".taCmd", 126)
        item.ShTC = KepItem.ServerHandle
        lServerHandles(temp + 4) = KepItem.ServerHandle
        Set KepItem = KepItems.AddItem(HeadSuffix & ".Yuzhiliang", 127)
        item.ShYZL = KepItem.ServerHandle
liaohao0101 2018-05-02
  • 打赏
  • 举报
回复
引用 24 楼 chewinggum 的回复:
[quote=引用 23 楼 liaohao0101 的回复:] [quote=引用 9 楼 zhao4zhong1 的回复:] 如果需要在代码中延迟比如5秒,参考下面:
Dim after As Double
        after = Now + 5# / 24# / 3600#
        Do
            DoEvents
            If Now > after Then
                logtofile "wait 5s"
                Exit Do
            End If
        Loop
引用这个方法和单独用一个DoEvents有啥区别没有?[/quote] 单个doevents,不确定等多久。 觉得你还是把 SHItem 这个对象的调用方法或者实现机制说一下,主要问题应该是由于对象内部的运作方式导致的。[/quote] SHItem保存所有的Opc变量的服务器端句柄,除了句柄外没有其他内容,在上面4楼贴出的方法中添加Opc变量,并且将变量的句柄保存在item中。SHItem的内容如下所示:
Public ShS00 As Long            '保存S00这个Opc变量的服务器端的句柄
Public ShQR As Long             '保存QtyReamining这个变量的服务器端的句柄
Public ShSF As Long             
Public ShHL As Long             
SHItem类中的字段很多,其他的字段和上面的是一样的。
脆皮大雪糕 2018-05-02
  • 打赏
  • 举报
回复
引用 23 楼 liaohao0101 的回复:
[quote=引用 9 楼 zhao4zhong1 的回复:] 如果需要在代码中延迟比如5秒,参考下面:
Dim after As Double
        after = Now + 5# / 24# / 3600#
        Do
            DoEvents
            If Now > after Then
                logtofile "wait 5s"
                Exit Do
            End If
        Loop
引用这个方法和单独用一个DoEvents有啥区别没有?[/quote] 单个doevents,不确定等多久。 觉得你还是把 SHItem 这个对象的调用方法或者实现机制说一下,主要问题应该是由于对象内部的运作方式导致的。
liaohao0101 2018-05-02
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
如果需要在代码中延迟比如5秒,参考下面:
Dim after As Double
        after = Now + 5# / 24# / 3600#
        Do
            DoEvents
            If Now > after Then
                logtofile "wait 5s"
                Exit Do
            End If
        Loop
引用这个方法和单独用一个DoEvents有啥区别没有?
liaohao0101 2018-05-02
  • 打赏
  • 举报
回复
产生一个error就直接报错了,应该不是出错的问题。
amengdiao 2018-05-02
  • 打赏
  • 举报
回复
确实,需要针对具体情况!
liaohao0101 2018-05-02
  • 打赏
  • 举报
回复
引用 18 楼 chewinggum 的回复:
[quote=引用 17 楼 liaohao0101 的回复:] [quote=引用 16 楼 chewinggum 的回复:] [quote=引用 15 楼 liaohao0101 的回复:] [quote=引用 14 楼 Chen8013 的回复:] 你在7楼说“单步没问题”,难道你真的单步执行,把那两千多个变量都“初始化”完了?
初始化变量的时候有20个循环,每个循环中有几十个变量,我在其中的两个变量上打的断点来调试的。添加了DoEvents以后在调试模式下的确执行的很慢,执行完毕后变量也正确初始化了。但是到了正式环境下程序一下子就执行完了几乎没有延迟,而且记录的日志显示变量也没有被正确初始化。程序关闭了以后进程也结束不掉。[/quote] 去服务端取数据是同步方式还是异步方式? 觉得应该是异步方式,服务器端还没返回,你的doevents就已经结束了进行下一个循环。你调试的时候OK是因为本机稍微慢点,测试服务器反馈快吧。单步OK也是因为你的单步执行,恰好等到了服务器返回。[/quote] 单步调试的时候不加DoEvents变量的初始化也是对的。添加了DoEvents以后在本地编译以后生成exe执行的时候也没有问题。但是到了服务器程序一下子就执行完了。执行方式应该是同步方式吧,我没有用到多线程。[/quote] 测试一下,单步执行到循环这里,然后把网络断掉,去掉doevents 按F5继续,看是不是唰唰往下跑,根本没有等待通讯超时。如果是同步方式,应该每次取数据都应该等待超时。[/quote] 我取数据是从本机取的,我模拟一个error看下吧
liaohao0101 2018-05-02
  • 打赏
  • 举报
回复
引用 16 楼 chewinggum 的回复:
[quote=引用 15 楼 liaohao0101 的回复:] [quote=引用 14 楼 Chen8013 的回复:] 你在7楼说“单步没问题”,难道你真的单步执行,把那两千多个变量都“初始化”完了?
初始化变量的时候有20个循环,每个循环中有几十个变量,我在其中的两个变量上打的断点来调试的。添加了DoEvents以后在调试模式下的确执行的很慢,执行完毕后变量也正确初始化了。但是到了正式环境下程序一下子就执行完了几乎没有延迟,而且记录的日志显示变量也没有被正确初始化。程序关闭了以后进程也结束不掉。[/quote] 去服务端取数据是同步方式还是异步方式? 觉得应该是异步方式,服务器端还没返回,你的doevents就已经结束了进行下一个循环。你调试的时候OK是因为本机稍微慢点,测试服务器反馈快吧。单步OK也是因为你的单步执行,恰好等到了服务器返回。[/quote] 单步调试的时候不加DoEvents变量的初始化也是对的。添加了DoEvents以后在本地编译以后生成exe执行的时候也没有问题。但是到了服务器程序一下子就执行完了。执行方式应该是同步方式吧,我没有用到多线程。
脆皮大雪糕 2018-05-02
  • 打赏
  • 举报
回复
引用 17 楼 liaohao0101 的回复:
[quote=引用 16 楼 chewinggum 的回复:] [quote=引用 15 楼 liaohao0101 的回复:] [quote=引用 14 楼 Chen8013 的回复:] 你在7楼说“单步没问题”,难道你真的单步执行,把那两千多个变量都“初始化”完了?
初始化变量的时候有20个循环,每个循环中有几十个变量,我在其中的两个变量上打的断点来调试的。添加了DoEvents以后在调试模式下的确执行的很慢,执行完毕后变量也正确初始化了。但是到了正式环境下程序一下子就执行完了几乎没有延迟,而且记录的日志显示变量也没有被正确初始化。程序关闭了以后进程也结束不掉。[/quote] 去服务端取数据是同步方式还是异步方式? 觉得应该是异步方式,服务器端还没返回,你的doevents就已经结束了进行下一个循环。你调试的时候OK是因为本机稍微慢点,测试服务器反馈快吧。单步OK也是因为你的单步执行,恰好等到了服务器返回。[/quote] 单步调试的时候不加DoEvents变量的初始化也是对的。添加了DoEvents以后在本地编译以后生成exe执行的时候也没有问题。但是到了服务器程序一下子就执行完了。执行方式应该是同步方式吧,我没有用到多线程。[/quote] 测试一下,单步执行到循环这里,然后把网络断掉,去掉doevents 按F5继续,看是不是唰唰往下跑,根本没有等待通讯超时。如果是同步方式,应该每次取数据都应该等待超时。
脆皮大雪糕 2018-05-02
  • 打赏
  • 举报
回复
引用 15 楼 liaohao0101 的回复:
[quote=引用 14 楼 Chen8013 的回复:] 你在7楼说“单步没问题”,难道你真的单步执行,把那两千多个变量都“初始化”完了?
初始化变量的时候有20个循环,每个循环中有几十个变量,我在其中的两个变量上打的断点来调试的。添加了DoEvents以后在调试模式下的确执行的很慢,执行完毕后变量也正确初始化了。但是到了正式环境下程序一下子就执行完了几乎没有延迟,而且记录的日志显示变量也没有被正确初始化。程序关闭了以后进程也结束不掉。[/quote] 去服务端取数据是同步方式还是异步方式? 觉得应该是异步方式,服务器端还没返回,你的doevents就已经结束了进行下一个循环。你调试的时候OK是因为本机稍微慢点,测试服务器反馈快吧。单步OK也是因为你的单步执行,恰好等到了服务器返回。
liaohao0101 2018-05-02
  • 打赏
  • 举报
回复
引用 14 楼 Chen8013 的回复:
你在7楼说“单步没问题”,难道你真的单步执行,把那两千多个变量都“初始化”完了?
初始化变量的时候有20个循环,每个循环中有几十个变量,我在其中的两个变量上打的断点来调试的。添加了DoEvents以后在调试模式下的确执行的很慢,执行完毕后变量也正确初始化了。但是到了正式环境下程序一下子就执行完了几乎没有延迟,而且记录的日志显示变量也没有被正确初始化。程序关闭了以后进程也结束不掉。
舉杯邀明月 2018-05-02
  • 打赏
  • 举报
回复
你在7楼说“单步没问题”,难道你真的单步执行,把那两千多个变量都“初始化”完了?
加载更多回复(10)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧