gpt4 book ai didi

c# - 事件不断引发,减慢代码速度。如何用线程处理它?

转载 作者:太空宇宙 更新时间:2023-11-03 16:34:01 26 4
gpt4 key购买 nike

我知道有更好的方法来做到这一点。我对多线程编程还很陌生,但是像下面的代码一样在新线程上引发我的事件可以让我的应用程序通过 Kinect 获得更高的 FPS。

当我的 KinectService 类的对象被初始化时,在该方法中我这样做:

Thread t = new Thread(() =>
{
sensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(sensor_AllFramesReady);
KinectSensor.KinectSensors.StatusChanged += new EventHandler<StatusChangedEventArgs>(Kinects_StatusChanged);
});
t.Start();

依次调用这个方法:

void sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e) 
{
using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
{
if (depthFrame == null)
{
return;
}

byte[] pixels = GenerateColoredBytes(depthFrame);
int stride = depthFrame.Width * 4;
BitmapSource test = BitmapSource.Create(depthFrame.Width, depthFrame.Height,
96, 96, PixelFormats.Bgr32, null, pixels, stride);

test.Freeze();

if (FrameChanged != null)
{
FrameChanged(test);
}
}
}

FrameChanged(test) 将新创建的位图传递回 View 模型,然后更新图像源。这是一种可怕的方法吗?给一个事件它自己的线程感觉不对,但是它使我的应用程序运行得更快。有什么指点吗?

最佳答案

事件在调用它们的同一个线程上触发,KinectSensor.AllFramesReady 的文档中没有任何其他说明。

因此在您的代码中,sensor.AllFramesReady 不会触发另一个事件,直到您的事件处理程序 (sensor_AllFramesReady) 返回。

一个更好的方法可能是更改您的事件处理程序以产生一个线程并立即返回。即

void sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)  
{
var frameReadyThread = new Thread(() =>
using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
{
//
}
frameReadyThread.Start();
}

您需要在 frameReadyThread 中进行一些同步,以确保满足以下条件,

  1. 帧未按顺序处理,您不希望帧 1 帧 2 之后更新
  2. 当框架不再做有用的工作而不是窃取 CPU 时,它们将被放弃。
  3. 如果您正在实现自己的线程分派(dispatch)器,您可以适本地扩展到您所在的机器。例如,如果您可以访问 8 个内核,并且您的处理程序代码受 CPU 限制,那么如果线程数超过 8 个,您就不太可能看到任何好处。

关于c# - 事件不断引发,减慢代码速度。如何用线程处理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9797209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com