我知道有更好的方法可以做到这一点。我对多线程编程很新,但是在一个新线程上提高我的事件,如下面的代码允许我的应用程序使用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)将新创建的位图传递回viewmodel,然后viewmodel更新图像源。这是一种可怕的方法吗?给一个事件它自己的线程感觉不对,但它使我的应用程序运行更快。有什么指针吗?
答案 0 :(得分:0)
事件是在调用它们的同一个线程上触发的,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中进行一些同步,以确保以下内容为真,