Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在事件中创建新线程_C#_Multithreading_Thread Safety_Kinect - Fatal编程技术网

C# 在事件中创建新线程

C# 在事件中创建新线程,c#,multithreading,thread-safety,kinect,C#,Multithreading,Thread Safety,Kinect,我已经在event sensor_DepthFrameReady中创建了一个线程,但是当我执行它时会抛出 函数SetImage1Frame的第8行(深度[depth]+;)上出现异常,并引发此异常: 索引超出了数组的边界。(深度=-1) 出什么事了?我认为函数(SetImage1Frame)执行了不止一次,但我只在这个方法中使用了这个函数(sensor_DepthFrameReady) void传感器\u深度帧就绪(对象发送器,深度图像帧就绪目标) { 短[]像素; 螺纹th; 使用(frame

我已经在event sensor_DepthFrameReady中创建了一个线程,但是当我执行它时会抛出 函数SetImage1Frame的第8行(深度[depth]+;)上出现异常,并引发此异常:

索引超出了数组的边界。(深度=-1)

出什么事了?我认为函数(SetImage1Frame)执行了不止一次,但我只在这个方法中使用了这个函数(sensor_DepthFrameReady)

void传感器\u深度帧就绪(对象发送器,深度图像帧就绪目标)
{
短[]像素;
螺纹th;
使用(frame=e.OpenDepthImageFrame())
{
如果(帧!=null)
{
像素=新短[frame.PixelDataLength];
frame.CopyPixelDataTo(像素);
th=新线程(()=>
设置图像1帧(像素);
th.Start();
}
}     
}
int[]深度=新int[4096];
int深度=0;
双倍宽度;
void SetImage1Frame(短[]像素)
{
int maxValue=0;
for(int i=0;i>DepthImageFrame.PlayerIndexBitmaskWidth;
如果(深度>0)
{
深度[深度]+;
}
}
for(int i=0;i0)
{
stackPanel1.Dispatcher.Invoke(新操作(()=>
{
矩形r=新矩形();
1.儿童。添加(r);
}));
}
}
image1.Dispatcher.BeginInvoke(新操作(()=>
{
WrbitmapImage.WritePixels(矩形,dpixels,步长,0);
}));
}

您的代码没有正确处理来自Kinect的签名数字。此程序演示了以下问题:-

class Program
{
    static void Main(string[] args)
    {
        short s = unchecked((short)0x8001);
        int i = s >> 3;
        Console.WriteLine(i);
    }
}

该程序将打印-4096。Kinect输入以short数组的形式出现,这是一种有符号类型。当您移开玩家索引时,该数字将被符号扩展,并保留为负数。在你的例子中,因为你看到的是-1,这可能是深度视图中的一个像素,距离超过4米。要解决此问题,您应该在处理深度像素值之前将其强制转换为ushort,并仅使用无符号类型。

您是否已通过调试器并在语句中断时查看该语句?顺便说一句,在每个深度帧上创建线程不是一个好主意。它可能非常慢,并且不太可能每秒启动30个新线程。如果创建线程的速度慢于数据的输入速度,则最终会耗尽内存。
class Program
{
    static void Main(string[] args)
    {
        short s = unchecked((short)0x8001);
        int i = s >> 3;
        Console.WriteLine(i);
    }
}