【问题标题】:VS application stops in Win7, when Debug and Release binaries are usedVS 应用程序在 Win7 中停止,当使用 Debug 和 Release 二进制文件时
【发布时间】:2014-05-20 15:50:47
【问题描述】:

所以,我在 Visual Basic 中制作了迭代的 Hanoi Towers of Hanoi 算法,它在 while 循环中运行(在 VB 中递归很慢)。问题是它编译得很好,它甚至在通过 Visual Studio 启动时运行得很好,但是当启动时生成的 Debug 和 Release 执行动画 stops 并显示以下消息:

过了一会儿,我只看到所有的棋子都移到了目的地,消息消失了。所以说它不是崩溃,因为应用程序仍在后台运行,它只是弹出这条消息,破坏动画。我只想让我的程序像直接从 Visual Studio 启动时一样运行。

经过一番思考... 我开始相信会发生这种情况,因为 Win7 将应用程序在 while 循环中运行的事实视为无响应(河内塔中的 7 件需要一段时间才能重新排列),因此它会尝试关闭它。

我怎样才能让我的应用程序忽略 Window 的广告?

【问题讨论】:

  • 如果你点击“等待程序响应”,它最终会这样做吗?
  • 不,广告消息消失了,但应用程序的窗口仍然是灰色的。如果我再等一会儿,我就会看到所有的碎片都重新排列在不同的杆子上。

标签: vb.net winforms visual-studio-2010 visual-studio


【解决方案1】:

我建议您在应用程序空闲事件中进行计算,就像您在创建 Windows 游戏时一样。这样可以确保消息队列不被阻塞。

Public Class Form1

    Public Sub New()
        Me.InitializeComponent()
        AddHandler Application.Idle, AddressOf Me.OnApplicationIdle
    End Sub

    Private Sub OnApplicationIdle(sender As Object, e As EventArgs)
        Static rnd As New Random()
        Dim message As MSG = Nothing
        Do While (Not PeekMessage(message, IntPtr.Zero, 0, 0, 0))
            '...
            Me.BackColor = Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256))
            '...
        Loop
    End Sub

    <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
    Friend Shared Function PeekMessage(<[In](), Out()> ByRef msg As MSG, ByVal hwnd As IntPtr, ByVal msgMin As Integer, ByVal msgMax As Integer, ByVal remove As Integer) As Boolean
    End Function

    <StructLayout(LayoutKind.Sequential)> _
    Friend Structure MSG
        Public hwnd As IntPtr
        Public message As Integer
        Public wParam As IntPtr
        Public lParam As IntPtr
        Public time As Integer
        Public pt_x As Integer
        Public pt_y As Integer
    End Structure

End Class

【讨论】:

  • Application.Idle 事件仅在应用程序空闲时引发。您没有理由处理消息。如果你打算使用PeekMessage,你也可以在其他地方使用。它仍将保持应用程序响应。这将防止您泄漏内存,因为您未能在所示代码中分离Application.Idle 的事件处理程序,这是一个常见错误。
  • @CodyGray 不要使用Application.DoEvents()。为什么?阅读这篇 SO 帖子:Use of Application.DoEvents。这是一篇解释为什么/如何使用Application.Idle的帖子:What is the standard C# / Windows Forms game loop?
  • 呃,我什么时候推荐使用 DoEvents 了?我在这个网站上写了无数的答案和 cmets 反对它。
  • @CodyGray Ops,我把你误认为是 OP。我的评论是对他/她的回答的回应。对不起。
猜你喜欢
  • 2013-09-05
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多