2009-12-14 85 views
0

我正在努力處理與我的通信類相關的事件。事件干擾子程序

我在通過串行連接接收新數據時,通過事件處理函數調用'DataChange'函數。然後我繼續將這些數據加載到DataGridView中,爲用戶執行一些格式化等。由於DataChange事件被調用的頻率,我遇到了很多問題,似乎在其他子程序和函數的中間進程中佔據了焦點。

例如,我會嘗試傳回數據回串行設備。在格式化數據之後,但在我實際上可以從我的庫中調用發送函數之前,將焦點導回到DataChange,並且我從未實際傳輸數據。

這是一個問題,通過對DataChange相關例程進行線程化,在函數或例程重新掛接之前解除DataChange事件,或者是否存在一些我沒有實現的基本原則。

+0

你解決了你的問題嗎? – 2009-12-29 18:41:15

回答

1

這聽起來像它可能是一個線程同步問題。

事件本質上是線程化的,因此通過添加線程來解決它並不是問題。

嘗試使用SyncLock確保線程同步。

無論何時您接收到數據,都會鎖定對象,直到完成數據使用。

SyncLock lockObject 
    'Handle data changed... 
End SyncLock 

我相信這種情況是一種競爭條件。

0

讓您的數據進入一個線程的緩衝區並從另一個線程觀察緩衝區。在主線程上,將緩衝區標記爲「準備發送」並且具有輔助線程監視。只要確保SyncLock的對象。根據你的數據是什麼,你可以創建一個對象來包裝它,只需使用一個布爾標誌,然後將其轉儲到List(Of T)中。使顯示器線程休眠50或者毫秒,鎖定緩衝區並檢查標誌,提取需要的內容,解鎖列表並將數據推出。