Камера Aforge застряла на предыдущем экземпляре dll - PullRequest
0 голосов
/ 14 июля 2020

Я разрабатываю C# .dll, который будет использоваться в других приложениях. Я использую Aforge для камеры.

Бывают случаи, когда другие приложения ломают sh и не могут отключить камеру (камера logitech остается с включенным светодиодом).

Если я снова открою приложение он не может подключиться к камере. Есть ли способ восстановить соединение с камерой, не отключая ее от USB-порта?

Я пытался убить аналогичный процесс, но он не работал

    public bool connectCamera_dll(string id_Camera, out string error)
        {
            Process myProc = Process.GetCurrentProcess();
            Process[] p = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
            foreach (var pro in p)
            {
                if (pro.Id != myProc.Id)
                {
                    pro.Kill();
                }
            }

            myProc = null;
            Array.Clear(p, 0, p.Length);

            VideoCapabilities videoCap = null;

            //Check if id exist
            bool idExist = false;
            foreach (var section in iniData.Sections)
            {
                if (section.SectionName.Equals(id_Camera))
                {
                    idExist = true;
                    break;
                }
                else
                {
                    idExist = false;
                }
            }

            if (idExist)
            {
                try
                {
                    string MonikerString = iniData[id_Camera]["cameraID"];
                    camera = new VideoCaptureDevice(MonikerString);

                    if (!SupportFrameSizes())
                    {
                        error = "Camera not Connected: not detected";
                        return false;
                    }

                    foreach (var capabilities in videoCapabilities)
                    {
                        if (capabilities.FrameSize.Width.ToString().Equals(iniData[id_Camera]["ResolutionWith"]))
                        {
                            if (capabilities.FrameSize.Height.ToString().Equals(iniData[id_Camera]["ResolutionHeight"]))
                            {
                                videoCap = capabilities;
                                break;
                            }
                            else
                            {
                                videoCap = null;
                            }
                        }
                    }
                    if (videoCap != null)
                    {
                        camera.VideoResolution = videoCap;
                        camera.NewFrame += new NewFrameEventHandler(video_NewFrame);
                        camera.Start();

                        if (camera.IsRunning)
                        {
                            //bool ok = true;
                        }
                        //Wait for camera frames
                        int timeout = 0;
                        while (_lastFrame == null)
                        {
                            System.Threading.Thread.Sleep(1);
                            timeout++;
                            if (timeout >= 5000)
                            {
                                GC();
                                myProc = Process.GetCurrentProcess();
                                p = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
                                foreach (var pro in p)
                                {
                                    if (pro.Id != myProc.Id)
                                    {
                                        pro.Kill();
                                    }
                                }
                                throw new Exception("Camera not responding");                                
                            }
                        }
                    }

                    //loadWebcamConfiguration();
                }
                catch (Exception ex)
                {
                    error = ex.Message;
                    return false;
                }
                error = "";
                //return true;
            }
            else
            {
                error = "Camera ID not found";
                return false;
            }

            error = camera.IsRunning ? "" : "Camera not Connected: is not running";

            return camera.IsRunning;
        }
...