2009-12-14 127 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或者毫秒,锁定缓冲区并检查标志,提取需要的内容,解锁列表并将数据推出。