gjx_12 2018-10-12 07:09 采纳率: 0%
浏览 747
已结题

关于C# 将串行口通信放到事件函数了导致整个函数卡死

void Reader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
{
var reference = e.FrameReference.AcquireFrame();

        // Color
        using (var frame = reference.ColorFrameReference.AcquireFrame())
        {
            if (frame != null)
            {
                //将图像转入writeablebitmmap
                FrameDescription colorFrameDescription = frame.FrameDescription;
                using (KinectBuffer colorBuffer = frame.LockRawImageBuffer())
                {
                    this.colorBitmap.Lock();

                    // verify data and write the new color frame data to the display bitmap
                    if ((colorFrameDescription.Width == this.colorBitmap.PixelWidth) && (colorFrameDescription.Height == this.colorBitmap.PixelHeight))
                    {
                        frame.CopyConvertedFrameDataToIntPtr(
                            this.colorBitmap.BackBuffer,
                            (uint)(colorFrameDescription.Width * colorFrameDescription.Height * 4),
                            ColorImageFormat.Bgra);

                        this.colorBitmap.AddDirtyRect(new Int32Rect(0, 0, this.colorBitmap.PixelWidth, this.colorBitmap.PixelHeight));
                    }

                    this.colorBitmap.Unlock();
                }
                if (_mode == CameraMode.Color)
                {
                    camera.Source = frame.ToBitmap();
                }
            }
        }

        // Depth
        using (var frame = reference.DepthFrameReference.AcquireFrame())
        {
            if (frame != null)
            {
                if (_mode == CameraMode.Depth)
                {
                    camera.Source = frame.ToBitmap();
                }
            }
        }

        // Infrared
        using (var frame = reference.InfraredFrameReference.AcquireFrame())
        {
            if (frame != null)
            {
                if (_mode == CameraMode.Infrared)
                {
                    camera.Source = frame.ToBitmap();
                }
            }
        }

        // Body
        using (var frame = reference.BodyFrameReference.AcquireFrame())
        {
            if (frame != null)
            {
                canvas.Children.Clear();

                _bodies = new Body[frame.BodyFrameSource.BodyCount];

                frame.GetAndRefreshBodyData(_bodies);

                foreach (var body in _bodies)
                {
                    if (body.IsTracked)
                    {
                        // COORDINATE MAPPING
                        foreach (Joint joint in body.Joints.Values)
                        {

                            if (joint.TrackingState == TrackingState.Tracked)
                            {
                                // 3D space point
                                CameraSpacePoint jointPosition = joint.Position;

                                // 2D space point
                                System.Windows.Point point = new System.Windows.Point();


                                if (_mode == CameraMode.Color)
                                {
                                    ColorSpacePoint colorPoint = _sensor.CoordinateMapper.MapCameraPointToColorSpace(jointPosition);

                                    point.X = float.IsInfinity(colorPoint.X) ? 0 : colorPoint.X / 2;
                                    point.Y = float.IsInfinity(colorPoint.Y) ? 0 : colorPoint.Y / 2;
                                    //获取肩肘腕,脊椎中间坐标
                                    switch (joint.JointType)
                                    {
                                        case JointType.WristLeft:
                                            WristLeft.X = point.X;
                                            WristLeft.Y = point.Y;
                                            break;
                                        case JointType.ElbowLeft:
                                            ElbowLeft.X = point.X;
                                            ElbowLeft.Y = point.Y;
                                            break;
                                        case JointType.ShoulderLeft:
                                            ShoulderLeft.X = point.X;
                                            ShoulderLeft.Y = point.Y;
                                            break;
                                        case JointType.SpineShoulder:
                                            SpineShoulder.X = point.X;
                                            SpineShoulder.Y = point.Y;
                                            break;
                                        case JointType.ShoulderRight:
                                            ShoulderRight.X = point.X;
                                            ShoulderRight.Y = point.Y;
                                            break;
                                        case JointType.ElbowRight:
                                            ElbowRight.X = point.X;
                                            ElbowRight.Y = point.Y;
                                            break;
                                        case JointType.WristRight:
                                            WristRight.X = point.X;
                                            WristRight.Y = point.Y;
                                            break;
                                        case JointType.ThumbRight:
                                            ThumbRight.X = point.X;
                                            ThumbRight.Y = point.Y;
                                            break;
                                        case JointType.HandLeft:
                                            HandLeft.X = point.X;
                                            HandLeft.Y = point.Y;
                                            break;

                                    }
                                }
                                else if (_mode == CameraMode.Depth || _mode == CameraMode.Infrared) // Change the Image and Canvas dimensions to 512x424
                                {
                                    DepthSpacePoint depthPoint = _sensor.CoordinateMapper.MapCameraPointToDepthSpace(jointPosition);

                                    point.X = float.IsInfinity(depthPoint.X) ? 0 : depthPoint.X / 2;
                                    point.Y = float.IsInfinity(depthPoint.Y) ? 0 : depthPoint.Y / 2;
                                }


                                // Draw 红色圆,直径10
                                Ellipse ellipse = new Ellipse
                                {
                                    Fill = System.Windows.Media.Brushes.Red,
                                    Width = 10,
                                    Height = 10
                                };

                                Canvas.SetLeft(ellipse, point.X - ellipse.Width / 2);
                                Canvas.SetTop(ellipse, point.Y - ellipse.Height / 2);
                                canvas.Children.Add(ellipse);
                            }
                        }
                        DrawHand(body.HandLeftState,HandLeft);
                        lefthandheight = HandLeft.Y;
                        Addangle(lefthandheight,HandLeft);
                        rightshoulderangle = GetAngle(SpineShoulder, ShoulderRight, ElbowRight);
                        rightelbowangle = GetAngle(ShoulderRight, ElbowRight, WristRight);
                        if (elbowrightflag)
                        {
                            DrawingLine(ShoulderRight, ElbowRight);//连接肩肘
                            DrawingLine(ElbowRight, WristRight);//连接肘腕
                            //DrawingLine(WristRight, ThumbRight);
                            //计算肘角度并添加到canvas 
                            //rightwristangle = GetAngle(ElbowRight,WristRight,ThumbRight);

                            Addangle(rightelbowangle, ElbowRight);
                            //Addangle(rightwristangle, WristRight);
                        }

                        if (shoulderrightflag)
                        {
                            DrawingLine(ShoulderRight, ElbowRight);//连接肩肘
                            DrawingLine(SpineShoulder, ShoulderRight);//连接肩和肩中
                            //计算肩角度并添加到canvas

                            Addangle(rightshoulderangle, ShoulderRight);
                        }

                        if (issend)
                        {
                            rightshoulder = Convert.ToInt32(rightshoulderangle+155);
                            rightelbow = Convert.ToInt32(rightelbowangle + 100);
                            lefthigh = Convert.ToInt32(lefthandheight+100);
                            switch (body.HandLeftState)
                            {
                                case HandState.Open:
                                    lefthand = 100;
                                    break;
                                case HandState.Closed:
                                    lefthand = 200;
                                    break;
                                case HandState.Lasso:
                                    lefthand = 300;
                                    break;
                                case HandState.NotTracked:
                                    lefthand = 100;
                                    break;
                                case HandState.Unknown:
                                    lefthand = 100;
                                    break;

                            }
                            srightshoulder = Convert.ToString(rightshoulder);
                            srightelbow = Convert.ToString(rightelbow);
                            slefthigh = Convert.ToString(lefthigh);
                            slefthand = Convert.ToString(lefthand);
                            txtStatus.Text = srightelbow;
                            //com.Write($"s{srightshoulder}{srightelbow}{slefthigh}190{slefthand}");
                            //Thread.Sleep(20);  延时
                            if (flag == 1)
                            {
                                com.Write("s");
                                //Thread.Sleep(5);
                                com.Write(srightshoulder);
                                //Thread.Sleep(5);
                                com.Write(srightelbow);
                                flag = 2;
                            }
                            else if (flag == 2)
                            {
                                com.Write(slefthigh);
                                //Thread.Sleep(5);
                                com.Write("190");
                                flag = 3;
                            }
                            else if (flag == 3)
                            {
                                com.Write(slefthand);
                                //Thread.Sleep(5);
                                flag = 1;
                            }
                            //com.Write("s");  
                            //Thread.Sleep(5);
                            //com.Write($"{srightshoulder}{srightelbow}{slefthigh}190{slefthand}");
                            //com.Write(srightshoulder);
                            //Thread.Sleep(5);
                            // com.Write(srightelbow);
                            //Thread.Sleep(5);
                            // com.Write(slefthigh);
                            //Thread.Sleep(5);
                            //com.Write("190");
                            //Thread.Sleep(5);
                            //com.Write(slefthand);
                           // Thread.Sleep(5);
                        }








                    }
                }
            }
        }
    }
    这是一个Kinect程序 其中这个大函数是一个事件触发函数 我用的是wpf 我想将我数据处理的值通过串行口通信发送过去,但是当发送两个数据的时候就会卡死的了,该怎么解决我这个问题?具体的串行口通信代码都在最后面 前面是一些数据的chu'l
  • 写回答

3条回答 默认 最新

  • Lingxy 2018-10-12 09:20
    关注

    事件函数其实是界面线程,这种时间长的工作建议放工作线程

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)