代码之家  ›  专栏  ›  技术社区  ›  Dark Star1

如何减少c_中的接口延迟?

  •  1
  • Dark Star1  · 技术社区  · 15 年前

    我在C中的接口延迟有问题。

    既然我还在学习,请耐心听我解释。

    我把问题缩小到我的计时器对象。

    基本上,我的程序通过TCP/IP套接字查询设备,并将其输出到屏幕上的文本框。

    现在,我每秒钟对设备进行一次轮询,以获取数据,这需要将一些逻辑隐藏在计时器对象中,以下是节拍之间发生的情况:

    1. 增加一个值。
    2. 构造表示要发送到的命令的2个字符串 盒子(封装在一个函数中
    3. 对命令进行编码
    4. 发送命令
    5. 清除字节数组
    6. 收到回复。

    在事件处理程序中进行的处理是否过多?每次我试图在轮询会话期间移动窗口时,即当计时器运行时,我都会得到一个非常糟糕的输入延迟。

    3 回复  |  直到 11 年前
        1
  •  11
  •   Pete Davis    11 年前

    您使用的计时器正在Windows消息线程上执行。因此,当轮询运行时,将阻止Windows消息队列。这不是做太多处理的问题,大多数时候线程将等待TCP/IP响应。

    要解决这个问题,您只需要在后台线程上完成工作,然后在UI线程上更新UI。

    .NET框架中有一堆不同的计时器,它们以不同的方式工作,您使用的计时器处理同一线程上的计时器事件,其他计时器处理后台线程。 Check this article out about the different timers .

    您还可以使用当前计时器调用BackgroundWorker组件在后台线程上进行工作。这样做的主要好处是后台工作人员将在后台线程上完成工作,但将在UI线程上引发“完成工作”事件,这样就可以轻松地更新UI,而无需担心您所处的线程。

        2
  •  2
  •   elan    15 年前

    我认为这是因为您试图在UI线程中进行工作。在后台工作线程中运行计时器。

        3
  •  1
  •   Scott Dorman    15 年前

    好像发生了一些事情。首先,您可能在计时器计时处理程序中做了太多的工作。如何构造字符串并对命令进行编码?其中任何一个都可以在勾选处理程序之外完成,或者以任何方式简化(例如,使用string.format调用)?实际上.NET中有三种不同的计时器,它们的分辨率不同。你用的是哪个计时器?

    最大的问题是你的间歇时间是1秒。不管怎样,这都是很大的处理开销。请记住,在大多数情况下,每次命中间隔并调用勾号处理程序时,都会导致线程之间的上下文切换。这其中涉及到一些开销(您不能做任何事情),而且上下文切换的频率越高,性能出现的速度就越慢。