0

私は次のコードを持っています:

Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim mesaj As New Integer

        My.Computer.Network.DownloadFile("http://rotutorial.net/anunt.txt", "c:\classmate\msg1.txt", "", "", False, 60000, True)
        Dim readtext As New System.IO.StreamReader("c:\classmate\msg1.txt")
        Dim text As String
        text = readtext.ReadToEnd
        readtext.Close()
        Dim parti(10) As String
        parti = text.Split("_")

        Dim writetext1 As New System.IO.StreamReader("c:\classmate\msg.txt")
        Dim text1 As String
        Dim parti1(10) As String
        text1 = writetext1.ReadToEnd
        parti1 = text1.Split("_")

        writetext1.Close()
        Dim unic As New Integer
        unic = Val(parti(0))
        Dim unic1 As New Integer
        unic1 = Val(parti1(0))

        If unic <> unic1 Then
            If unic <> unic1 Then
                mesaj = MsgBox(parti(3), vbYesNo, "Mesaj")
            End If
            Dim writetext2 As New System.IO.StreamWriter("c:\classmate\msg.txt")
            Dim text2 As String
            text2 = text & "/" & text1
            writetext2.Write(text2)
            writetext2.Close()

            Timer1.Enabled = False
            Timer1.Enabled = True
        End If
        Timer1.Enabled = False
        Timer1.Enabled = True






    End Sub

タイマー間隔は 5000 (5 秒) に設定されていますが、タイマーが作動するたびに msgbox が画面に表示されますが、ファイル msg.txt には 1 回書き込まれます。そのため、タイマーはそのユニックがユニック 1 と異なるかどうかをチェックし、異なる場合はメッセージボックスを表示し、msg.txt に新しい行を書き込みますが、ユニックとユニック 1 が msgbox に等しい場合でも、次のタイマーティックでとにかく表示されますが、ファイルに再度書き込むのではなく、msgbox のみを表示するため、より興味深いものです。私はこれを理解していません。

私の悪い英語でごめんなさい、私はルーマニア出身です。

ありがとうございました!

4

1 に答える 1

2

メッセージ ボックスは、正しい理由で間違った場所に使用すると、少し危険な場合があります。これはそれらの1つです。問題は、メッセージ ループの動作を維持するように設計されたループ内で、DoEvents を呼び出すのと同じことを行うことです。Paint イベントやメッセージ ボックスの入力イベントなどの Windows メッセージがディスパッチされ、通常どおり処理されるようにします。これにより、UI がフリーズするのを防ぎます。

ただし、再入可能性の問題が発生する可能性があります。メッセージ ボックスは、アプリケーション内のすべてのウィンドウを無効にすることで、最も深刻な問題を解決します。これらのウィンドウの 1 つをクリックしたときに鳴るビープ音に注意してください。ただし、 Timer メッセージはブロックされません。したがって、5 秒後に Timer1_Tick() メソッドが再び実行されます。別のメッセージ ボックスを表示しています。それらを閉じるのに十分な時間待つと、画面がメッセージ ボックスでいっぱいになります。ファイル操作コードを複数回実行すると、追加の問題が発生する可能性があります。

回避策は簡単です。メソッドの開始時にタイマーを無効にするだけです。最後に再度有効にします。また、BackgroundWorker は、このようなコードでは一般的な選択肢であり、ファイルのダウンロードが遅いために UI がフリーズするのを防ぎます。

于 2012-06-02T14:32:15.450 に答える