在做我们公司系统报警软件 
我的程序如果一句一句单步运行很正常,但只要一块执行就死机,搞了几天还没找出原因,很是郁闷 
 
请求各位大哥哥,大姐姐帮忙,看看有没有好的办法,来找出死机的原因 .

解决方案 »

  1.   

    这个是从串口接收报警信号的过程
    Private Sub Comm1_OnComm()
    On Error Resume Next
        Dim Result1 As String
        Dim DD1 As Integer
        Dim DD2 As Integer
        Dim i As Integer
        Dim FQ() As Integer
        FC = ""    JS = Comm1.Input    If CStr(Hex(JS(1))) = "38" And CStr(Hex(JS(2))) = "4D" Then
            CH = CStr(Hex(JS(3)))
            FH = CStr(Hex(JS(4)))
            TH = CStr(Hex(JS(5)))
            DH = CStr(Hex(JS(6)))
            FC = CStr(Hex(JS(7)))
            DD1 = SixteenTurnTen(FC)
            
            If FC = "0" Then
                Tp = "紧急报警"
                NT_sub
                TH_sub
                Exit Sub
            End If
            For i = 1 To 8
                FQ(i) = 0
            Next i
            Do
                If DD1 Mod 2 = 1 Then
                    Result1 = "1" & Result1
                    DD1 = DD1 - 1 / 2
                    
                Else
                    Result1 = "0" & Result1
                    DD1 = DD1 / 2
                End If
            Loop While DD1 = 0
            
            DD2 = Len(Result1)
      
            For i = DD2 To 1 Step -1
                If Mid(Result1, i, 1) = 1 Then
                    FQ(i) = 1
                Else
                    FQ(i) = 0
                End If
            Next i
            For i = 1 To 8
                Select Case FQ(i)
                    Case 0
                    Case 1
                        Select Case i
                            Case 1
                                Tp = "红外报警"
                                NT_sub
                                TH_sub
                            Case 2
                                Tp = "门磁报警"
                                NT_sub
                                TH_sub
                            Case 3
                                Tp = "火灾报警"
                                NT_sub
                                TH_sub
                            Case 4
                                Tp = "煤气报警"
                                NT_sub
                                TH_sub
                            Case 5
                                Tp = "红外报警"
                                NT_sub
                                TH_sub
                            Case 6
                                Tp = "门磁报警"
                                NT_sub
                                TH_sub
                            Case 7
                                Tp = "火灾报警"
                                NT_sub
                                TH_sub
                            Case 8
                                Tp = "煤气报警"
                                NT_sub
                                TH_sub
                        End Select
                End Select
            Next i
        Else
            Exit Sub
        End If    
    End Sub
      

  2.   


    这个是接收到紧急报警时所要运行的过程,就在NT_sub过程死机
    Public Sub TH_sub()
        Select Case TH
            Case "1"
                SBB(1).Visible = False
            Case "2"
                SBB(2).Visible = False
            Case "3"
                SBB(3).Visible = False
            Case "4"
                SBB(4).Visible = False
            Case "5"
                SBB(5).Visible = False
            Case "6"
                SBB(6).Visible = False
            Case "7"
                SBB(7).Visible = False
            Case "8"
                SBB(8).Visible = False
            Case "9"
                SBB(9).Visible = False
            Case "10"
                SBB(10).Visible = False
        End Select
    End SubPublic Sub NT_sub() 在这个过程中死机
         Nt = DH + "栋" + TH + "梯" + CH + "层" + FH + "号"
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        str = "SELECT OName From Owner where NT='" & Nt & "'"
        If rs1.State Then
            rs1.Close
        End If
        rs1.Open str, cn, adOpenDynamic, adLockOptimistic, adCmdText
        If rs1.RecordCount < 1 Then
            str = "空"
        Else
            str = rs1!Oname
        End If
        Dt = Now
        
        rs.AddNew
        rs!Nt = Nt
        rs!Oname = str
        rs!AlarmTime = Dt
        rs!Type = Tp
        rs!EmpName = loginName
        rs!HandleResult = "未曾处理"
        rs.Update
                
        SD = str
        
        
        If frmMsage.Visible = True Then
            If frmMsage1.Visible = True Then
                If frmMsage2.Visible = True Then
                    If frmMsage3.Visible = True Then
                        If frmMsage4.Visible = True Then
                            If frmMsage5.Visible = True Then
                                If frmMsage6.Visible = True Then
                                    If frmMsage7.Visible = True Then
                                        If frmMsage8.Visible = True Then
                                            If frmMsage9.Visible = True Then
                                                Unload frmMsage
                                                frmMsage.Show
                                            Else
                                                frmMsage9.Show
                                            End If
                                        Else
                                            frmMsage8.Show
                                        End If
                                    Else
                                        frmMsage7.Show
                                    End If
                                Else
                                    frmMsage6.Show
                                End If
                            Else
                                frmMsage5.Show
                            End If
                        Else
                            frmMsage4.Show
                        End If
                    Else
                        frmMsage3.Show
                    End If
                Else
                    frmMsage2.Show
                End If
            Else
                frmMsage1.Show
            End If
        Else
            frmMsage.Show
        End If
        If rs9.State Then
            rs9.Close
        End If
        str22 = "SELECT * From Alarm where HandleResult = '未曾处理'"
        rs9.Open str22, cn, adOpenDynamic, adLockOptimistic, adCmdText
        Label2.Caption = "未处理报警:" & rs9.RecordCount & "次"
    End Sub
      

  3.   

    if ... end if 层数太多了吧?
      

  4.   

    是不是代码太长了,我的一个MDI模块有2000多行,这只是一不分,问题就出在下面这两个过程
    这个是从串口接收报警信号的过程,只看
    Private Sub Comm1_OnComm()
    On Error Resume Next
        Dim Result1 As String
        Dim DD1 As Integer
        Dim DD2 As Integer
        Dim i As Integer
        Dim FQ() As Integer
        FC = ""    JS = Comm1.Input    If CStr(Hex(JS(1))) = "38" And CStr(Hex(JS(2))) = "4D" Then
            CH = CStr(Hex(JS(3)))
            FH = CStr(Hex(JS(4)))
            TH = CStr(Hex(JS(5)))
            DH = CStr(Hex(JS(6)))
            FC = CStr(Hex(JS(7)))
            DD1 = SixteenTurnTen(FC)
            
            If FC = "0" Then
                Tp = "紧急报警"
                NT_sub
                TH_sub
                Exit Sub
            End If
        end if
    End SubPublic Sub NT_sub() 在这个过程中死机
         Nt = DH + "栋" + TH + "梯" + CH + "层" + FH + "号"
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        str = "SELECT OName From Owner where NT='" & Nt & "'"
        If rs1.State Then
            rs1.Close
        End If
        rs1.Open str, cn, adOpenDynamic, adLockOptimistic, adCmdText
        If rs1.RecordCount < 1 Then
            str = "空"
        Else
            str = rs1!Oname
        End If
        Dt = Now
        
        rs.AddNew
        rs!Nt = Nt
        rs!Oname = str
        rs!AlarmTime = Dt
        rs!Type = Tp
        rs!EmpName = loginName
        rs!HandleResult = "未曾处理"
        rs.Update
                
        SD = str
        
        
        If frmMsage.Visible = True Then
            If frmMsage1.Visible = True Then
                If frmMsage2.Visible = True Then
                    If frmMsage3.Visible = True Then
                        If frmMsage4.Visible = True Then
                            If frmMsage5.Visible = True Then
                                If frmMsage6.Visible = True Then
                                    If frmMsage7.Visible = True Then
                                        If frmMsage8.Visible = True Then
                                            If frmMsage9.Visible = True Then
                                                Unload frmMsage
                                                frmMsage.Show
                                            Else
                                                frmMsage9.Show
                                            End If
                                        Else
                                            frmMsage8.Show
                                        End If
                                    Else
                                        frmMsage7.Show
                                    End If
                                Else
                                    frmMsage6.Show
                                End If
                            Else
                                frmMsage5.Show
                            End If
                        Else
                            frmMsage4.Show
                        End If
                    Else
                        frmMsage3.Show
                    End If
                Else
                    frmMsage2.Show
                End If
            Else
                frmMsage1.Show
            End If
        Else
            frmMsage.Show
        End If
        If rs9.State Then
            rs9.Close
        End If
        str22 = "SELECT * From Alarm where HandleResult = '未曾处理'"
        rs9.Open str22, cn, adOpenDynamic, adLockOptimistic, adCmdText
        Label2.Caption = "未处理报警:" & rs9.RecordCount & "次"
    End Sub
      

  5.   

    是不是对数据库操作时候产生的死循环?
    rs1 前面打开后 没有关闭 是不是在过程中又调用了rs1?
      

  6.   

    doevents加多点试试看不过也不至于死机把
      

  7.   

    老兄你的算法不行啊,好多地方都可以很简略的象这里
    Public Sub TH_sub()
        Select Case TH
            Case "1"
                SBB(1).Visible = False
            Case "2"
                SBB(2).Visible = False
            Case "3"
                SBB(3).Visible = False
            Case "4"
                SBB(4).Visible = False
            Case "5"
                SBB(5).Visible = False
            Case "6"
                SBB(6).Visible = False
            Case "7"
                SBB(7).Visible = False
            Case "8"
                SBB(8).Visible = False
            Case "9"
                SBB(9).Visible = False
            Case "10"
                SBB(10).Visible = False
        End Select
    End Sub
    直接改成
    Public Sub TH_sub()
      DIM TEMP 
      TEMP=TH
      SBB(TEMP).Visble=false 
    End Sub
    就OK了
      

  8.   

    还有这里
    If frmMsage.Visible = True Then
            If frmMsage1.Visible = True Then
                If frmMsage2.Visible = True Then
                    If frmMsage3.Visible = True Then
                        If frmMsage4.Visible = True Then
                            If frmMsage5.Visible = True Then
                                If frmMsage6.Visible = True Then
                                    If frmMsage7.Visible = True Then
                                        If frmMsage8.Visible = True Then
                                            If frmMsage9.Visible = True Then
                                                Unload frmMsage
                                                frmMsage.Show
                                            Else
                                                frmMsage9.Show
                                            End If
                                        Else
                                            frmMsage8.Show
                                        End If
                                    Else
                                        frmMsage7.Show
                                    End If
                                Else
                                    frmMsage6.Show
                                End If
                            Else
                                frmMsage5.Show
                            End If
                        Else
                            frmMsage4.Show
                        End If
                    Else
                        frmMsage3.Show
                    End If
                Else
                    frmMsage2.Show
                End If
            Else
                frmMsage1.Show
            End If
        Else
            frmMsage.Show
        End If
    可以改为frmMsage的 数组控件 frmMsage(9)  ' 0~9
    那样就简单的写成如下算法
    DIM X AS INTEGER
    FOR X=0 TO 8
      IF frmMsage(X).Visible Then
        frmMsage(X).Show
        EXIT FOR
      END IF
    NEXT
    IF frmMsage(9).Visible THEN
      Unload frmMsage
      frmMsage.SHOW
    END IF
    这样是不是容易理解 看起来也舒服点