为什么在我的输出中会出现一个额外的“ - ”字符?

时间:2012-07-19 15:24:03

标签: vb.net winforms

我正在尝试创建一个yahoo messenger自动回复应用程序。如果我使用按钮来检索它,我可以检索新消息,但是如果我使用计时器来获取新消息,它会向我显示带有额外标记的新消息。这是错误。

Error

这是代码:

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的计时器。显示额外的错误 - 应该是什么?谢谢

2 个答案:

答案 0 :(得分:4)

问题是你的暂停()。任何DoEvents()的使用总是令人怀疑,但是你在计时器滴答事件中这样做,这特别有问题 - 你很幸运没有看到StackOverflow Exceptions。

这里发生了什么:当你调用Pause()时,程序进入一个循环来交替地睡眠和处理其他事件。如果还有另一个要处理的事件,它就像直接在当前执行路径上调用该方法一样。由于您有一个定期将新事件放入消息队列的计时器,因此您的计时器标记处理程序可以间接最终作为递归函数调用自身。如果你不小心你可以发现这比事件完成的更快:tick处理程序运行,调用Pause(),Pause()调用DoEvents(),DoEvents()再次调用tick处理程序,一遍又一遍。从来没有达到关闭Yahoo的代码,你最终会添加到你的调用堆栈,直到它满了(溢出)并且程序崩溃。

谢天谢地,这里没有发生。这些症状表明你的tick方法会自行递归,但它只会重复一次。事件触发,它到达对DoEvents()的调用,DoEvents()在同一执行路径中再次运行tick事件。这一次事件一直处理(Pause()在另一个tick事件被引发之前完成)并完成它应该做的所有事情。现在原始事件可以完成处理,只有没有消息可以阅读。它将两个空字符串与&#34; - &#34;连接起来。字符,你的额外输出。

就个人而言,我会重写以避免使用DoEvents(),但快速修复此处尝试在tick事件的第一行禁用您的计时器并在最后一行重新启用它嘀嗒事件。

答案 1 :(得分:1)

  

我意识到为时已晚! ;-),问题是由于listbox.items.add()执行两次因为   “System.DoEvents()”

我建议您在代码中进行以下更改,请告知他们是否解决了您的问题。

来自:

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

至此:

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

如果这不能解决您的问题,我很确定无论发生什么,因为消息末尾有一个尾随“ - ”,如果每个单独的列表条目最终都会增加一行“ - ”然后尝试使用以下内容消除最后一个字符,如果它确实找到“ - ”。

从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