我是编程的新手,所以请多多包涵。
我正在使用的这个VB6程序(我是新来的工作)使用的是旧的但已更新的Borland C ++ DLL(我也在更新),以从中获取零件清单。
在VB6 IDE中的调试模式下,一切都可以正常工作,但是当我创建一个实际的可执行文件并尝试使用它时,它就会崩溃。为此的“修复”在我到达这里之前已经实施了好几年,他们添加了一堆WaitFor函数调用来“减慢VB6的速度,以便它可以在继续操作之前完成从DLL的读取”。
奇怪的是,我通过放置一些对特定部分进行硬编码的if-check并将其放入DLL中来更新VB6代码,因为它们无法使Borland C ++ DLL先前得到更新。当然,副作用是VB6代码运行得更快。
我已经将问题缩小为简单的时机。在一个部分中,如果我仅添加一个简单的MsgBox,它不会崩溃,但是即使设置为100000,WaitFor也无法使用。
所以我的问题是,是否可以阻止VB6代码继续运行而不完成从DLL的读取,而无需任意添加WaitFors等。这似乎是一种糟糕的做法,我将在这家公司工作一段时间,不想继续这种趋势。
谢谢!
更新:
代替MsgBox来执行此操作似乎也可以使其正常工作:
Dim x as Long
Dim y as Long
For x= 1 to 500
y = y + 1
Next
只需添加废话即可解决此问题。
WaitFor函数:
On Error Resume Next
Static dLastDoevents As Double
Dim SleepyTime As Integer: SleepyTime = 20 'set "Sleep peroid" in milliseconds (this is also the resolution of the doevents rate)
Dim DoEventsRate As Integer: DoEventsRate = 200 'set "DoEvents rate" in milliseconds
Dim iSleepTimes As Integer: iSleepTimes = Int(MilliSeconds / SleepyTime)
Dim msLeftOver As Integer: msLeftOver = (MilliSeconds - (iSleepTimes * SleepyTime))
Dim dNow As Double
Dim i As Integer
If MilliSeconds < 0 Then MilliSeconds = 0
dNow = Timer
If dNow > (dLastDoevents + (DoEventsRate / 1000)) Or dLastDoevents = 0 Or dLastDoevents > dNow Then
DoEvents 'DoEvents if it's been long enough according to the DoeventsRate
dLastDoevents = Timer
End If
If iSleepTimes > 0 Then
For i = 1 To iSleepTimes
Sleep (SleepyTime) 'Sleep at intervals of SleepyTime
dNow = Timer
If dNow > (dLastDoevents + (DoEventsRate / 1000)) Or dLastDoevents = 0 Or dLastDoevents > dNow Then
DoEvents 'DoEvents if it's been long enough according to the DoeventsRate
dLastDoevents = Timer
End If
Next i
End If
If msLeftOver > 0 Then
Sleep (msLeftOver) 'Sleep for the remainder of milliseconds if needed (ie WaitFor 5)
dNow = Timer
If dNow > (dLastDoevents + (DoEventsRate / 1000)) Or dLastDoevents = 0 Or dLastDoevents > dNow Then
DoEvents 'DoEvents if it's been long enough according to the DoeventsRate
dLastDoevents = Timer
End If
End If
在调试模式下,Visual Basic 6 IDE不会编译为本机代码(它解释为P代码),因此,从exe运行时,代码的行为与崩溃时的行为不同。您可以生成一个使用P代码的.exe,但不建议这样做。(它在某种程度上减慢了执行速度,但似乎您想放慢速度)。
如评论部分所述,WaitFor不是VB函数,并且VB6以其简单的多线程功能而闻名。很难从这里找出崩溃的原因,但是众所周知,由于堆栈溢出, DoEvents会导致崩溃。
由于您可以访问这两个代码,因此建议您修改它们以提供基于事件的机制。如果您不使用COM或不想引发COM事件,则还可以使用其他通信渠道(如命名管道)来告知VB6工作已完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句