我在使用VB 的过程中发现我使用以下方式编写代码时,程序不能完全退出:
Private sub test_Load()
        do while true
            Doevents
        loop
          
end sub
即使我关闭了窗口,但是因为有个死循环始终在执行,所以一直不能完全关闭。增加Doevents的目的是使得我能关闭窗口。我在实际使用过程中,需要使用到无限期等待,所以发现了这个问题,没办法解决,请教高手指点。谢谢!

解决方案 »

  1.   

    用 End 结束试试
    或者这样Option Explicit
    Dim blnExit As BooleanPrivate Sub Command1_Click()
        '单击这个按钮就退出
        blnExit = True
        Unload Me
    End SubPrivate Sub Form_Load()
        Me.Show
        Do While blnExit = False
            DoEvents
        Loop
    End Sub
      

  2.   

    用End是这样Private Sub Command2_Click()
        End
    End Sub
      

  3.   

    Private Sub Form_Unload(Cancel As Integer)
        End
    End Sub
      

  4.   

    赞同楼上讲的。在unload事件中加入end
      

  5.   

    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
      End
    End Sub
      

  6.   

    加标志好点(原来down的)
    Dim IsExit As Boolean
        Private Sub Command1_Click()
        Dim L As Long
         IsExit = False
         Do While DoEvents
         If IsExit = True Then Exit Do
         L = L + 1
         Loop
        
        End Sub
        
        Private Sub form_unload()''或者在form_unload模块中等等
         IsExit = True
        End Sub
        其中 isexit是全局变量
        有些人喜欢用end语句来结束程序,小程序固然可以,但当太大,或者调用了某些特殊的api函数后可能导致预想不到的错误,如果装载了许多东西在程序结束时不处理将卸载很慢,而且这种做法也极不符合正规软件的要求...总之end语句毛病很多,此不详谈,建议少使用甚至不使用
      

  7.   

    语句 描述 
    End 停止执行。不是必要的,可以放在过程中的任何位置关闭代码执行、关闭以 Open 语句打开的文件并清除变量。 
    End Function 必要的,用于结束一个 Function 语句。 
    End If 必要的,用于结束一个If…Then…Else 语句块。 
    End Property 必要的,用于结束一个Property Let、Property Get、或 Property Set 过程。 
    End Select 必要的,用于结束一个 Select Case 语句。 
    End Sub 必要的,用于结束一个 Sub 语句。 
    End Type 必要的,用于结束一个用户定义类型的定义(Type 语句)。 
    End With 必要的,用于结束一个 With 语句。 
    说明在执行时,End 语句会重置所有模块级别变量和所有模块的静态局部变量。若要保留这些变量的值,改为使用 Stop 语句,则可以在保留这些变量值的基础上恢复执行。注意   End 语句不调用 Unload、QueryUnload、或 Terminate 事件或任何其它 Visual Basic 代码,只是生硬地终止代码执行。窗体和类模块中的 Unload、QueryUnload、和 Terminate 事件代码未被执行。类模块创建的对象被破坏,由 Open 语句打开的文件被关闭,并且释放程序所占用的内存。其它程序的对象引用无效。End 语句提供了一种强迫中止程序的方法。Visual Basic 程序正常结束应该卸载所有的窗体。只要没有其它程序引用该程序公共类模块创建的对象并无代码执行,程序将立即关闭。
      

  8.   

    感谢大家! 
    通过试验发现,ceagle(无知者无畏) 提出来的“end困惑”的确存在,当我的form中调用了某些API函数或者其他某些第三方控件时,程序并不能依赖end而完全退出,还有一些资源依旧被占用。51365133(渊海)的解释应该是比较合理的。
    再次谢谢大家!
      

  9.   

    最好在家上set form=nothing 
    unload me
      

  10.   

    '
    '退出系统函数声明
    Private Sub UnloadPrj()
        Dim frm As Form
        For Each frm In VB.Forms
            If frm.Name <> "Main" Then
                Unload frm
            End If
        Next
        End
    End Sub'调用
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        If MsgBox("确定退出系统?", vbYesNo + vbQuestion, "提示") = vbYes Then        UnloadPrj     '卸载程序
        Else
            Cancel = 1
            UnloadMode = 1
        End If
    End Sub
      

  11.   

    '声明措兰,应该是这样
    Private Sub UnloadPrj()
        Dim frm As Form
        For Each frm In VB.Forms
            Unload frm
        Next
        End
    End Sub
      

  12.   

    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
    Public Const GW_OWNER = 4
    Public Const WM_CLOSE = &H10
    SC_CLOSE = &HF060&Public Function GetIDEmode() As Boolean
        Dim strfileName As String
        Dim lngCount As Long
        strfileName = String(255, 0)
        lngCount = GetModuleFileName(App.hInstance, strfileName, 255)
        strfileName = Left(strfileName, lngCount)
        If UCase(Right(strfileName, 7)) <> "VB6.EXE" Then
            GetIDEmode = False   '否
        Else
            GetIDEmode = True   '是
        End If
        '//也可以获取VB的版本等信息
    End Function
    然后弄个Timer出来
    在里面写    If GetIDEmode = False Then   '开发环境
            Dim lhWndTop As Long
            Dim lhWnd As Long
            lhWnd = Me.hwnd
            lhWndTop = lhWnd
            Do While Not (lhWnd = 0)
                lhWnd = GetWindow(lhWnd, GW_OWNER)
                If Not (lhWnd = 0) Then
                    lhWndTop = lhWnd
                End If
                SendMessage lhWndTop, WM_CLOSE, SC_CLOSE, SC_CLOSE   '这是关闭的特殊方法
            Loop
          Else        
            End
        End If
      

  13.   

    用end 
    或者unload me
      

  14.   

    在按钮中增加end,这句以后不再有别的事件发生,程序彻底退出。