为什么我需要WaitFor'/ MsgBox以防止在从C ++ DLL获取数据的VB6 exe中崩溃

基思

我是编程的新手,所以请多多包涵。

我正在使用的这个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
Furkan Omay尚未活跃在Medium上。

在调试模式下,Visual Basic 6 IDE不会编译为本机代码(它解释为P代码),因此,从exe运行时,代码的行为与崩溃时的行为不同。您可以生成一个使用P代码的.exe,但不建议这样做。(它在某种程度上减慢了执行速度,但似乎您想放慢速度)。

如评论部分所述,WaitFor不是VB函数,并且VB6以其简单的多线程功能而闻名。很难从这里找出崩溃的原因,但是众所周知,由于堆栈溢出, DoEvents会导致崩溃

由于您可以访问这两个代码,因此建议您修改它们以提供基于事件的机制。如果您不使用COM或不想引发COM事件,则还可以使用其他通信渠道(如命名管道)来告知VB6工作已完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我需要将我的源代码保留在Proguard Rules中以防止崩溃?

为什么延迟加载 C# 中的数据在我需要之前加载?

为什么我们需要C ++中的基本数据类型

来自VB6 DLL的枚举值未出现在C#中

为什么我们需要在Windows C ++中链接kernel32.dll,user32.dll等?

为什么我们需要C ++中的虚函数?

为什么我不能在VB6 TextBox中拆分从Android收到的文本行

为什么我的递归好友功能在VB6中不起作用?

Get在VB6中做什么?

从VB6调用C ++ DLL传递垃圾数据作为参数吗?

为什么在C中实现列表时我的程序崩溃?

在 VB6 中使用 bang(!) 运算符在 C# dll 中返回一个对象

为什么我需要重新加载页面才能从Angular中的subjectSubscription获取数据?

VB6中的get语句的C#等效项是什么?

在VB6中引用.Net dll的调试不起作用,但运行.exe可以

通过使用VB6 DLL保护我的部分代码

为什么AddVectoredExceptionHandler使我的DLL崩溃?

如何从AutoHotkey脚本调用vb6中编码的.dll?

如何从.NET中的VB6 dll使用方法?

找不到从VB6调用的C ++ DLL程序

为什么我在仅公开具有WideString参数的函数的Delphi dll中需要Sharemem?

sql 中的 listview vb6:需要对象

为什么我需要服务器、用户名和密码才能在 C# 中创建数据库?

为什么我们需要在字符串中获取单词

为什么此程序在C中崩溃?

为什么我们需要在Android应用中存储Goefence数据?

为什么我们需要在链接列表中填充数据?

为什么我们需要将数据的转置传递到 sklearn StandardScaler() 中?

谁能解释我为什么在SQLite数据库中需要此KEY_ID?