我正在尝试创建一个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的计时器。显示额外的错误 - 应该是什么?谢谢
答案 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