为什么断点调试的时候正常,直接运行就出错?

时间:2021-02-05 15:35:40
有一段程序代码,大致是这样的:

        While  checkOK=False
            。。。。
            For i = 0 To 7
                Select Case str(i)
                    Case 3 
                        。。。。
                        checkOK=True
                    Case 2
                        。。。。
                    Case Else
                        。。。。
                End Select
            Next i

        End While
。。。。。

直接运行这个程序,貌似while只执行了一边,后续程序就出错了。但是如果在调试的时候,在end while或前面某处设置一个 断点或者 msgbox,就没有问题。
这是为什么?
怎么样才知道到底是什么错误?
谢谢!

12 个解决方案

#1


贴完整的代码,这样看不出问题

#2


单这点代码,看不出来

#3


代码牵连的比较多,算了,就不贴了,我刚才试了一下,在end while前面加了一个sleep就好了。

#4


哦哦!!

#5


难道用了多线程?不然怎么用会sleep

#6


多线程调用

#7


加个这个,Application.DoEvents()
也行,

#8


引用 3 楼 yinzs 的回复:
代码牵连的比较多,算了,就不贴了,我刚才试了一下,在end while前面加了一个sleep就好了。

这说明你的程序在循环之后执行的代码依赖于某个异步I/O操作的结果,sleep、msgbox以及断点都会使程序暂停,等到程序继续执行时,异步I/O已经完成了,所以可以正常运行。检查一下程序依赖的操作具体是什么,用代码来执行等待。

#9


引用 8 楼 cnzdgs 的回复:
引用 3 楼 yinzs 的回复:
代码牵连的比较多,算了,就不贴了,我刚才试了一下,在end while前面加了一个sleep就好了。

这说明你的程序在循环之后执行的代码依赖于某个异步I/O操作的结果,sleep、msgbox以及断点都会使程序暂停,等到程序继续执行时,异步I/O已经完成了,所以可以正常运行。检查一下程序依赖的操作具体是什么,用代码来执行等待。

是的,就是这样。while段是串口传输数据,后面的代码就是跟传输结果有关。

所以我用sleep就可以了吗?还是要改成其他的?

#10


checkOK在退出While循环之后就为True,那你在下次运行到While循环之前是否有将checkOK设为False,以及在哪里设置的?

sleep不是必须的,可以通过修改其它地方的代码避免使用的

#11


checkOK在while开始之前就初始为false了。
就是说还是代码有错误了。
因为,如果不加断点,我在后面查了一下,每次返回的传输结果都是不一样的。有时候他只执行一次while。

#12


引用 9 楼 yinzs 的回复:
是的,就是这样。while段是串口传输数据,后面的代码就是跟传输结果有关。

所以我用sleep就可以了吗?还是要改成其他的?

最好是等待操作完成,如果无法得知操作何时完成,就只能用Sleep的方式了。

#1


贴完整的代码,这样看不出问题

#2


单这点代码,看不出来

#3


代码牵连的比较多,算了,就不贴了,我刚才试了一下,在end while前面加了一个sleep就好了。

#4


哦哦!!

#5


难道用了多线程?不然怎么用会sleep

#6


多线程调用

#7


加个这个,Application.DoEvents()
也行,

#8


引用 3 楼 yinzs 的回复:
代码牵连的比较多,算了,就不贴了,我刚才试了一下,在end while前面加了一个sleep就好了。

这说明你的程序在循环之后执行的代码依赖于某个异步I/O操作的结果,sleep、msgbox以及断点都会使程序暂停,等到程序继续执行时,异步I/O已经完成了,所以可以正常运行。检查一下程序依赖的操作具体是什么,用代码来执行等待。

#9


引用 8 楼 cnzdgs 的回复:
引用 3 楼 yinzs 的回复:
代码牵连的比较多,算了,就不贴了,我刚才试了一下,在end while前面加了一个sleep就好了。

这说明你的程序在循环之后执行的代码依赖于某个异步I/O操作的结果,sleep、msgbox以及断点都会使程序暂停,等到程序继续执行时,异步I/O已经完成了,所以可以正常运行。检查一下程序依赖的操作具体是什么,用代码来执行等待。

是的,就是这样。while段是串口传输数据,后面的代码就是跟传输结果有关。

所以我用sleep就可以了吗?还是要改成其他的?

#10


checkOK在退出While循环之后就为True,那你在下次运行到While循环之前是否有将checkOK设为False,以及在哪里设置的?

sleep不是必须的,可以通过修改其它地方的代码避免使用的

#11


checkOK在while开始之前就初始为false了。
就是说还是代码有错误了。
因为,如果不加断点,我在后面查了一下,每次返回的传输结果都是不一样的。有时候他只执行一次while。

#12


引用 9 楼 yinzs 的回复:
是的,就是这样。while段是串口传输数据,后面的代码就是跟传输结果有关。

所以我用sleep就可以了吗?还是要改成其他的?

最好是等待操作完成,如果无法得知操作何时完成,就只能用Sleep的方式了。