在事件中创建新线程
本文关键字:线程 新线程 事件 创建 | 更新日期: 2023-09-27 18:30:30
我在事件sensor_DepthFrameReady中创建了一个线程,但是当我执行它时,抛出了第 8 行(深度[深度]++;)在函数 SetImage1Frame 中并抛出此异常:
索引超出数组的范围。(深度 = -1)
出了什么问题?我认为该函数(SetImage1Frame)正在执行不止一次,但我仅在此方法中使用了此功能(sensor_DepthFrameReady)!!
void sensor_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
{
short[] pixels;
Thread th;
using (frame=e.OpenDepthImageFrame())
{
if (frame!=null)
{
pixels = new short[frame.PixelDataLength];
frame.CopyPixelDataTo(pixels);
th = new Thread(() =>
SetImage1Frame(pixels));
th.Start();
}
}
}
int[] Depths=new int[4096];
int depth=0;
double chartBarWidth;
void SetImage1Frame(short[] dpixels)
{
int maxValue = 0;
for (int i = 0; i < dpixels.Length; i++)
{
depth = dpixels[i] >> DepthImageFrame.PlayerIndexBitmaskWidth;
if (depth > 0)
{
Depths[depth]++;
}
}
for (int i = 0; i < Depths.Length; i++)
{
maxValue=Math.Max(maxValue,Depths[i]);
}
for (int i = 0; i < Depths.Length; i++)
{
if (Depths[i] > 0)
{
stackPanel1.Dispatcher.Invoke(new Action(() =>
{
Rectangle r = new Rectangle();
stackPanel1.Children.Add(r);
}));
}
}
image1.Dispatcher.BeginInvoke(new Action(() =>
{
WrbitmapImage.WritePixels(rect, dpixels, stride, 0);
}));
}
您的代码未正确处理来自 Kinect 的签名号码。该程序演示了问题:-
class Program
{
static void Main(string[] args)
{
short s = unchecked((short)0x8001);
int i = s >> 3;
Console.WriteLine(i);
}
}
此程序将打印 -4096。Kinect 输入以短数组的形式出现,这是一种有符号的类型。当您移开玩家索引时,该数字正在扩展并保留为负数。在您的情况下,由于您看到的是-1,因此这可能是深度视图中超过4米远的像素。若要解决此问题,应在处理之前将深度像素值强制转换为 ushort,并仅使用无符号类型。