代码之家  ›  专栏  ›  技术社区  ›  Greg Buehler

事件干扰子例程

  •  0
  • Greg Buehler  · 技术社区  · 15 年前

    我正在为一个与我的交流课有关的活动而努力。

    每当我通过串行连接接收到新数据时,我都会通过事件处理程序调用“datachange”函数。然后我继续将数据加载到DataGridView中,为用户执行一些格式化等操作。由于调用DataChange事件的频率很高,我遇到了很多问题,并且似乎在进程中间从其他子程序和函数中窃取了焦点。

    例如,我将尝试将数据传回串行设备。在我格式化数据之后,但在我真正从我的库调用send函数之前,焦点被定向回datachange,而我从未真正传输我的数据。

    这是一个通过对与数据更改相关的例程进行线程处理、在函数或例程之前取消对数据更改事件的挂起,然后重新挂起来最好解决的问题,还是我没有实现一些基本原则?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Brett Allen    15 年前

    这听起来可能是线程同步问题。

    事件本身是线程化的,因此通过添加线程来解决它不是一个问题。

    尝试使用同步锁来确保线程同步。

    每当您收到数据时,锁定一个对象,直到您使用完数据为止。

    SyncLock lockObject
        'Handle data changed...
    End SyncLock
    

    我认为这种情况的术语是一种种族条件。

        2
  •  0
  •   Chris Haas    15 年前

    让您的数据进入一个线程上的缓冲区,并从另一个线程观察缓冲区。在主线程上,将缓冲区标记为“准备发送”,并让辅助线程监视它。只需确保同步锁定对象。根据您的数据是什么,您可以创建一个对象来包装它,并使用一个布尔标记,然后将它转储到一个列表(T)中。让您的监视器线程休眠50毫秒或任何毫秒,锁定缓冲区并检查标志,拉出所需内容,解锁列表并将数据推出。