Vb.net 为什么我的输出中会显示一个额外的“-”字符?

Vb.net 为什么我的输出中会显示一个额外的“-”字符?,vb.net,winforms,Vb.net,Winforms,我正在尝试创建一个yahoo messenger自动回复应用程序。如果我使用按钮来检索新邮件,我可以检索新邮件,但是如果我使用计时器来获取新邮件,它会显示带有和额外标记的新邮件。这就是错误所在 这是代码: Private Sub Pause(ByVal seconds As Integer) Dim current As Date current = DateTime.Now Do While (DateTime.Now - current).TotalSeconds

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

这是代码:

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的计时器。显示超出应有范围的错误在哪里?谢谢

我意识到太晚了!;-,此问题是由于listbox.items.add执行了两次,原因是 系统事件

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

由此:

为此:

如果这不能解决您的问题,我很确定消息中的任何内容都有一个尾随-在结尾,如果您得到的每个列表条目都有一行-然后尝试使用以下方法删除最后一个字符,如果它确实找到-

从消息中删除尾随的-

我意识到太晚了!;-,此问题是由于listbox.items.add执行了两次,原因是 系统事件

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

由此:

为此:

如果这不能解决您的问题,我很确定消息中的任何内容都有一个尾随-在结尾,如果您得到的每个列表条目都有一行-然后尝试使用以下方法删除最后一个字符,如果它确实找到-

从消息中删除尾随的-


问题在于你的停顿。DoEvents的任何使用都是可疑的,但在这里,您是在计时器滴答声事件期间使用它的,这尤其有问题-您很幸运没有看到StackOverflow异常

发生的情况如下:当您调用Pause时,程序进入一个循环,交替地休眠和处理其他事件。如果要处理另一个事件,就像在当前执行路径上直接调用该方法一样。由于您有一个计时器,它定期在消息队列中放置新事件,因此您的计时器记号处理程序可以间接地作为递归函数结束并调用自身。如果不小心,您会发现这种情况发生的速度比事件完成的速度快:tick处理程序运行,它调用Pause、Pause调用DoEvents,DoEvents一遍又一遍地调用tick处理程序。关闭Yahoo的代码永远不会到达,您最终会添加到调用堆栈中,直到它完全溢出,程序崩溃

谢天谢地,这在这里没有发生。这些症状表明您的tick方法本身确实会递归,但它只会精确地递归一次。事件激发后,它到达对DoEvents的调用,该调用将在相同的执行路径中再次运行tick事件。这一次,在引发另一个滴答声事件并执行它应该执行的所有操作之前,事件会一直处理到暂停完成。现在,原始事件可以完成处理,只是不再需要读取任何消息。剩下的是将两个空字符串用-字符连接起来,这是额外的输出


就个人而言,我会重新编写以避免使用DoEvents,但为了快速修复,请尝试在滴答声事件的第一行禁用计时器,并在滴答声事件的最后一行重新启用计时器。

问题在于暂停。DoEvents的任何使用都是可疑的,但在这里,您是在计时器滴答声事件期间使用它的,这尤其有问题-您很幸运没有看到StackOverflow异常

发生的情况如下:当您调用Pause时,程序进入一个循环,交替地休眠和处理其他事件。如果要处理另一个事件,就像在当前执行路径上直接调用该方法一样。由于您有一个计时器,它定期在消息队列中放置新事件,因此您的计时器记号处理程序可以间接地作为递归函数结束并调用自身。如果不小心,您会发现这种情况发生的速度比事件完成的速度快:tick处理程序运行,它调用Pause、Pause调用DoEvents,DoEvents一遍又一遍地调用tick处理程序。关闭Yahoo的代码永远不会到达,您最终会添加到调用堆栈中,直到它完全溢出,程序崩溃

谢天谢地,这在这里没有发生。这些症状表明您的tick方法本身确实会递归,但它只会精确地递归一次。事件激发后,它到达对DoEvents的调用,该调用将在相同的执行路径中再次运行tick事件。这一次,在引发另一个滴答声事件并执行它应该执行的所有操作之前,事件会一直处理到暂停完成。现在,原始事件可以完成处理,只是不再需要读取任何消息。剩下的是将两个空字符串用-字符连接起来,这是额外的输出

就我个人而言,我会重新编写以避免使用DoEvents,但为了快速更新

x在此尝试在滴答声事件的第一行禁用计时器,并在滴答声事件的最后一行重新启用它。

当您引用额外标记时,您的确切意思是什么?按钮事件处理程序和计时器运行代码是否使用完全相同的代码?因为我通过pastebin lstBox.Items.Addymid+-+msg在您的代码中看到了这一点,并且这是您所说的额外标记吗?@Intrus an-,我认为我的话是错误的,对不起,我的英语不好,我不知道如何正确地说。在我的代码中,我使用lstBox.add.itemmid+-+msg,当我运行应用程序时,在收到具有该格式的新消息之后,它添加了一个额外的-,就像我附加的图像一样。Thanks@hometoast是的,它是。额外的-是我的意思,是的,按钮事件处理程序与计时器代码是相同的。暂停的使用是邪恶的。首先,使用DoEvents是可疑的,但在timer_tick事件期间尤其有问题。当您提到额外标记时,您的确切意思是什么?按钮事件处理程序和计时器运行代码是否使用完全相同的代码?因为我通过pastebin lstBox.Items.Addymid+-+msg在您的代码中看到了这一点,并且这是您所说的额外标记吗?@Intrus an-,我认为我的话是错误的,对不起,我的英语不好,我不知道如何正确地说。在我的代码中,我使用lstBox.add.itemmid+-+msg,当我运行应用程序时,在收到具有该格式的新消息之后,它添加了一个额外的-,就像我附加的图像一样。Thanks@hometoast是的,它是。额外的-是我的意思,是的,按钮事件处理程序与计时器代码是相同的。暂停的使用是邪恶的。首先,使用DoEvents是可疑的,但在timer_tick事件期间尤其有问题。我将尝试它,并告诉您它是否有效,它是否可能是由计时器或暂停函数引起的,导致它调用tick函数两次?谢谢。cstr与此无关。我将尝试它,并告诉您它是否有效,这可能是因为计时器或暂停功能导致它调用了两次滴答函数吗?谢谢。cstr与此无关。回答得好Joel,我意识到这太晚了@Joel Coehoom你的建议是什么?如果我必须重写它,我应该学习什么来重写它?thanks@yonghan79现在用斜体读我最后一句话的最后一部分!简单的解决方法。要重写它,请尝试使用BackgroundWorker控件,它将允许您直接调用sleep,而无需担心主线程上的阻塞。您可能仍然希望禁用计时器,但可能只有在您实际进入需要睡眠的if块时才禁用。@Joel Coehoorn我已尝试在第一行禁用计时器,并在最后一行重新启用它,应用程序无法正常工作。回答得好,乔尔,我意识到这太晚了@Joel Coehoom你的建议是什么?如果我必须重写它,我应该学习什么来重写它?thanks@yonghan79现在用斜体读我最后一句话的最后一部分!简单的解决方法。要重写它,请尝试使用BackgroundWorker控件,它将允许您直接调用sleep,而无需担心主线程上的阻塞。您可能仍然希望禁用计时器,但可能只有在您实际进入需要睡眠的if块时才禁用。@Joel Coehoorn我已尝试在第一行禁用计时器,并在最后一行重新启用它,应用程序无法正常工作。
 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