1

yahooメッセンジャーの自動返信アプリを作ろうと思っています。ボタンで取得すれば新着メールを取得できますが、タイマーで新着メールを取得すると、新着メールにプラスマークが表示されてしまいます。これがエラーです。

エラー

そして、これはコードです:

Private Sub Pause(ByVal seconds As Integer)
    Dim current As Date

    current = DateTime.Now
    Do While (DateTime.Now - current).TotalSeconds < seconds
        Application.DoEvents()
        Threading.Thread.Sleep(1000)
    Loop
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Dim keyword As String = ""
    Dim arrKeyword() As String
    Dim param As String = ""

    ymVersion = getYMVersion()
    Select Case ymVersion
        Case "8"
        hwndYMMainClass = FindWindow("YSearchMenuWndClass", vbNullString)
        Case "9"
            hwndYMMainClass = FindWindow("ATL:007C07F0", vbNullString)
        Case "10"
            hwndYMMainClass = FindWindow("CConvWndBase", vbNullString)
    End Select

    If hwndYMMainClass <> 0 Then
        pause(1)
        ymid = getYMID(hwndYMMainClass)
        msg = getYMMessage(hwndYMMainClass)
        lstBox.Items.Add(ymid + "-" + msg)
        ymChatSend(hwndYMMainClass, "Telah terima")
        closeYM(hwndYMMainClass)
    End If
End Sub

ところで、私は 500 の間隔でタイマーを使用しています。余分なものを示す間違いはどこにありますか?ありがとう

4

2 に答える 2

4

問題は Pauses() です。DoEvents() の使用は常に疑わしいものですが、ここではタイマー ティック イベント中に使用しており、特に問題があります。StackOverflow Exceptions が発生していないことは幸運です。

ここで何が起こっているかを示します。Pause() を呼び出すと、プログラムはループに入り、スリープと他のイベントの処理を交互に行います。処理する別のイベントがある場合は、現在の実行パスでそのメソッドを直接呼び出すのと同じです。新しいイベントをメッセージ キューに定期的に配置するタイマーがあるため、タイマー ティック ハンドラーは間接的に再帰関数になり、それ自体を呼び出すことができます。注意しないと、イベントが完了するよりも早くこれが発生することがわかります。Tick ハンドラーが実行され、Pause() が呼び出され、Pause() が DoEvents() を呼び出し、DoEvents() が Tick ハンドラーを繰り返し呼び出します。以上。Yahoo を閉じるコードに到達することはなく、コール スタックがいっぱいになる (オーバーフローする) までコール スタックに追加することになり、プログラムがクラッシュします。

ありがたいことに、それはここでは起こっていません。症状は、tick メソッドがそれ自体を再帰することを示唆していますが、正確に 1 回しか再帰しません。イベントが発生し、同じ実行パスで tick イベントを再度実行する DoEvents() の呼び出しに到達します。今回は、イベントが最後まで処理され (別の tick イベントが発生する前に Pause() が完了します)、想定されているすべてのことを実行します。これで、元のイベントの処理が終了し、読み取るメッセージがなくなりました。2 つの空の文字列を「-」文字で連結する必要があり、余分な出力があります。

個人的には、DoEvents() を使用しないように書き直しますが、ここで簡単に修正するには、ティック イベントの最初の行でタイマーを無効にし、ティック イベントの最後の行で再び有効にしてみてください。

于 2012-07-19T16:22:09.000 に答える
1

気付くのが遅かった!;-) 、この問題は、「System.DoEvents()」が原因で listbox.items.add() が 2 回実行されることが原因です。

私がお勧めするのは、コードに次の変更を加えることです。問題が解決するかどうかをお知らせください。

これから:

 ymid = getYMID(hwndYMMainClass)
 msg = getYMMessage(hwndYMMainClass)
 lstBox.Items.Add(ymid + "-" + msg)

これに:

 ymid = getYMID(hwndYMMainClass)
 msg = getYMMessage(hwndYMMainClass)
 lstBox.Items.Add(cstr(ymid) & "-" & cstr(msg))

それでも問題が解決しない場合は、メッセージとして入ってくるものには最後に「-」が付いていると確信しています。取得したすべてのリストエントリが「-」の追加行で終わる場合は、使用してみてください実際に「-」が見つかった場合は、次のようにして最後の文字を削除します。

メッセージから末尾の「-」を削除します。

Dim holdMsg as String = vbnullstring 'I'm not sure if msg is of type String...

     ymid = getYMID(hwndYMMainClass)
     msg = getYMMessage(hwndYMMainClass)
     holdMsg = cstr(msg)

        If holdMsg.Last = "-" Then
            'Remove that char from the string
            holdMsg = holdMsg.Substring(0, holdMsg.Length - 1)
            lstBox.Items.Add(cstr(ymid) & "-" & holdMsg)
        End If
于 2012-07-19T15:55:51.597 に答える