2011-08-29 88 views
0

在串行端口的DataReceviedHandler中,我測試是否設置了bool。 如果沒有,我將下一個塊發送到串口。DataReceviedHandler錯誤,也許是線程問題

布爾值由類事件設置。在圖中你可以看到程序進入了if語句,儘管bool是假的。這是一個線程問題嗎?我能做什麼?

a busy cat http://img163.imageshack.us/img163/3324/boolh.png

如果嘗試這樣做:

   lock (_syncLock) 
       { 
        if (_wrEEPROM) 
        { 
         //Hier müssen die weiteren 128er Blöche übertragen werden 
         SerialControl.Port.Write(_yTestMod.CreateYModemBlock(wrEE.EEPROMar, _eepromBlockIndex), 0, 
               _yTestMod.CreateYModemBlock(wrEE.EEPROMar, 2).Length); 
         _eepromBlockIndex += 1; 
        } 
       } 

,這在事件:

 lock (_syncLock) 
     { 
      _eeprom = false; 
      _logger = false; 
      _wrEEPROM = false; 
     } 

,但它仍然沒有工作。

+0

你是說你在開關的開頭有一個鎖(不管)嗎? –

+0

對不起,這是誤導,我的意思是布爾ist由一個類的事件設置... – Kingpin

+0

你需要一個鎖周圍寫_and_圍繞閱讀該布爾...也許在切換之前製作它的副本。 –

回答

1

的鎖:

創建一個私有字段變量:

private Object _syncLock = new Object(); 

,然後在任何你設置或讀取你的 「標誌」 -variable使用

lock(_syncLock) 
{ 
    myFlag = true; // whatever 
} 

lock(_syncLock) 
{ 
    return myFlag; 
} 

在您的在這種情況下,將事件的孔處理程序和上面顯示的代碼包裝在一起。

+0

順便說一句:如果您發佈了一些代碼而不是這張圖片,我可能會爲您的問題發佈一些* real *代碼 - 但我很懶得重新鍵入你的圖片的一些行;) – Carsten

+0

感謝您的輸入,下次我發佈代碼。但我想展示布爾的狀態。 – Kingpin

+0

是的,我知道 - 當然這是一個很好的比賽的一個問題。你試過鎖嗎? – Carsten

相關問題