0

SMS を送信するためのコードは次のとおりです。

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    count = DataTable1DataGridView.Rows.Count
    For i As Integer = count To 1 Step -1
        Try
            If SerialPort1.IsOpen Then
                'dataGridView1()
                ' TextBox1.Text = Me.dataGridView1.Rows(0).Cells(2).Value.ToString()
                With SerialPort1
                    .Write("AT" & vbCrLf)
                    .Write("AT+CMGF=1" & vbCrLf)
                    .Write("AT+CMGS=" & Chr(34) & DataTable1DataGridView.Rows(i - 1).Cells(2).Value.ToString & Chr(34) & vbCrLf)
                    .Write(ES_MSG.Rows(0).Cells(0).Value.ToString & Chr(26))
                End With
            Else
                MsgBox("Error on the port selected")
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        If (i = count) Then
            Exit For
            Timer1.Enabled = False
            Timer1.Stop()
        End If
        MsgBox("Message Sent!")
    Next
    Timer1.Enabled = False
    Timer1.Stop()
End Sub

button_click でタイマーを有効にしました。私の問題は、Timer.Stop() と Timer.Enabled = False をどこに置いても、タイマーが停止していないように見えることです。さらに悪いことに、エラーが発生したり、メッセージが送信されたりすると、データグリッドからのカウントがほんのわずかであっても、ポップアップが無限に表示されるように見えます。誰でもアイデアを共有できますか? ほんとうに必要だ。ありがとう。

4

2 に答える 2

2

まず、'Exit For' の後のコードは呼び出されません。

第 2 に、タイマー イベントがかなり頻繁に発生する場合、処理を待機しているイベントのキューがあり、これをイベントがまだ発生していると誤解している可能性があります。tick イベントの最初のアクションとしてタイマーを無効にし、必要に応じて終了時の最後のアクションとして再度有効にすることをお勧めします。

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    Timer1.Enabled = False
    Dim enableTimer as Boolean = True

    count = DataTable1DataGridView.Rows.Count
    For i As Integer = count To 1 Step -1
        Try
            If SerialPort1.IsOpen Then
                'dataGridView1()
                ' TextBox1.Text = Me.dataGridView1.Rows(0).Cells(2).Value.ToString()
                With SerialPort1
                    .Write("AT" & vbCrLf)
                    .Write("AT+CMGF=1" & vbCrLf)
                    .Write("AT+CMGS=" & Chr(34) & DataTable1DataGridView.Rows(i - 1).Cells(2).Value.ToString & Chr(34) & vbCrLf)
                    .Write(ES_MSG.Rows(0).Cells(0).Value.ToString & Chr(26))
                End With
            Else
                MsgBox("Error on the port selected")
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        If (i = count) Then
            enableTimer = False
            Exit For
            ' This code is never hit
            Timer1.Enabled = False
            Timer1.Stop()
        End If
        MsgBox("Message Sent!")
    Next

    Timer1.Enabled = enableTimer

End Sub
于 2013-02-19T20:38:26.243 に答える
0

以前に Timer を使用していましたが、Timer.Stop を使用せずに問題が発生したことはありません。コードを次のように変更することもできます。

 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    count = DataTable1DataGridView.Rows.Count
    For i As Integer = count To 1 Step -1
        Try
            If SerialPort1.IsOpen Then 'I had doubt with this condition, you are testing the same port over and over again
                'dataGridView1()
                ' TextBox1.Text = Me.dataGridView1.Rows(0).Cells(2).Value.ToString()
                With SerialPort1
                    .Write("AT" & vbCrLf)
                    .Write("AT+CMGF=1" & vbCrLf)
                    .Write("AT+CMGS=" & Chr(34) & DataTable1DataGridView.Rows(i - 1).Cells(2).Value.ToString & Chr(34) & vbCrLf)
                    .Write(ES_MSG.Rows(0).Cells(0).Value.ToString & Chr(26))
                End With
            Else
                MsgBox("Error on the port selected")
                'Is this an error? You may want to disable your timer here then call Exit Sub
            End If

        If (i = count) Then Exit For
        MsgBox("Message Sent!")

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    Next
    Timer1.Enabled = False
End Sub
于 2013-02-19T20:12:43.253 に答える