2015-12-02 60 views
0

我有一個計時器事件,它調用類似於下面的代碼的東西。我的問題是,間歇性地,myObject變量不保留bSuppresssSuppress的值從前面的執行,我最終丟失文本。我有時可以運行我的代碼25次而沒有問題。然後,它會再次發生,每4次中有1次。任何幫助深表感謝。在定時器Tick事件中不保留對象的對象

謝謝

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

發送的字符串更有可能不是你期望的,而是一個變量忘記其狀態 – Plutonix

回答

0

這段代碼

If right(sText, 1)<>" " then 
    bSuppress=true 
    sSuppress=sText 
    exit function 
end if 

一個尋找能告訴你沒有保證的bSuppresssSuppress保值。當條件right(sText, 1)<>" "評估爲true時,您的價值將發生變化。

此外,看着你的代碼,我可以提不同的線程以下

  1. Timer_Tick運行,並沒有保證在執行中出現的順序,特別是如果蜱接近
  2. cQueue.Add(sText)cQueue(1)。 ..爲什麼不是cQueue(0)?你如何確定指數?
  3. 如果您需要一個隊列,爲什麼不使用Queue對象,並使用Collection來代替?請記住,今天你永遠不要使用Collection和/或ArrayList - 這些只是爲了向後兼容才存在。
  4. 可能你應該告訴我們你想達到什麼目標,我們可以幫助你正確地重構你的代碼。
0

我想,由於Timer1_Tick()和DoText()在不同的線程上運行,您需要使用某種線程安全的互斥技術,如SyncLock。您不希望DoText()中斷Timer1_Tick()中的語句。

Private myObject As New someClass 
Private sOutput As String 
Private cQueue As New Collection 
Private lock As New Object 

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick 
    Dim sCmd As String 

    SyncLock lock 
     sCmd = cQueue(1) 
     sOutput &= myObject.getText(sCmd) 
     cQueue.Remove(1) 
    End SyncLock 

End Sub 

Public Sub DoText(ByVal sText As String) 
    'received from a socket connection on a separate thread 

    SyncLock lock 
     cQueue.Add(sText) 
    End SyncLock 

End Sub