我有一个计时器事件,调用类似于下面的代码。我的问题是,间歇性地,myObject
变量不会保留前一次执行中bSuppress
或sSuppress
的值,最终我会丢失文本。我有时可以运行我的代码25次没有问题。然后,它开始变得非常蓝色,每4次中有1次。非常感谢任何帮助。
谢谢
Private myObject as New someClass
Private sOutput as string
Private cQueue As New Collection
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
Dim sCmd as string
sCmd=cQueue (1)
sOutput &= myObject.getText(sCmd)
cQueue.Remove(1)
end sub
Public Sub DoText(ByVal sText As String)
'received from a socket connection on a separate thread
cQueue.Add(sText)
End Sub
Public Class someClass
Private sSuppress as String
Private bSuppress as Boolean
Public function getText(sText as String) as String
'if we didn't end in a space during the last function call
'than prepend the previous input string
if bSuppress then
sText=sSuppress & sText
end if
If right(sText, 1)<>" " then
bSuppress=true
sSuppress=sText
exit function
end if
return sText
end function
End Class
答案 0 :(得分:0)
查看此代码
If right(sText, 1)<>" " then
bSuppress=true
sSuppress=sText
exit function
end if
可以告诉您,您不能保证bSuppress
和sSuppress
的价值保留。条件right(sText, 1)<>" "
评估为true
时,您的值会发生变化。
此外,查看您的代码我可以提及以下
Timer_Tick
在不同的线程上运行,并且无法保证按顺序执行,特别是如果滴答很接近cQueue.Add(sText)
和cQueue(1)
...为什么不cQueue(0)
?你如何确定索引?Queue
对象,而是使用Collection
?请记住,今天您永远不应该使用Collection
和/或ArrayList
- 这些仅用于向后兼容。答案 1 :(得分:0)
我认为,由于Timer1_Tick()和DoText()在不同的线程上运行,您需要使用某种线程安全互斥技术,例如SyncLock。您不希望DoText()中断Timer1_Tick()中的语句。
composite -dissolve 10% -gravity center -quality 100 watermark_350.png my_own_png.png result.png