HandClientManager.cs 4.6 KB
using HalconDotNet;
using System; 
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Management;
using System.Windows.Forms;
using TSA_V.Common;

namespace TSA_V
{
    public class HandClientManager
    {
        public HandClientManager() { }


        private static Process process = null;


        public static void StartClient()
        {

            //判断是否启用
            if (!Setting_NInit.Device_HandsVideo)
            {
                LogUtil.info($"hand start : Device_HandsVideo={Setting_NInit.Device_HandsVideo}");
                return;
            }
            if(  Setting_NInit.Hand_ServerPort <= 0)
            {
                LogUtil.info($"hand start : Hand_ServerPort={Setting_NInit.Hand_ServerPort}");
                return;
            }
            int count = GetCameraCount();
            if(count<=0)
            { 
                LogUtil.info($"hand start : 未查询到相机");
                return;
            }

            //脚本所在地址
            string CurrentPath = System.IO.Directory.GetCurrentDirectory();
            string ScriptFileName = Application.StartupPath + @"\hands\defMTest.py"; 

            if(!File.Exists(ScriptFileName))
            {
                LogUtil.error($"hand start : 文件{ScriptFileName}不存在");
                return;
            }

            string sArguments = ScriptFileName; //脚本执行文件
            //用于执行程序最后的
            string sep = "-u";

            process = new Process();

            try
            {
                process.StartInfo.FileName = @"python.exe";

                //传递给进程
                process.StartInfo.Arguments = sArguments;
                process.StartInfo.UseShellExecute = false;//是否使用操作系统shell启动
                process.StartInfo.CreateNoWindow = true;   //是否在新窗口中启动该进程的值 (不显示程序窗口)
                process.StartInfo.RedirectStandardInput = true;  // 接受来自调用程序的输入信息
                process.StartInfo.RedirectStandardOutput = true;  // 由调用程序获取输出信息
                process.StartInfo.RedirectStandardError = true;  //重定向标准错误输出

                process.Start();// 启动程序 
                process.BeginOutputReadLine();
                process.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceivedText);

                LogUtil.info($"defMTest.py启动成功:{process.ProcessName},{process.Id}");
                //process.WaitForExit();  //等待程序执行完退出进程
                //process.Close();
            }

            catch (Win32Exception e)
            {
                LogUtil.error($"文件{ScriptFileName}启动出错:" + e.ToString());
            }
        }
        private static int GetCameraCount()
        {
            int cameraCount = 0;
            try
            {
                ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Caption LIKE '%camera%'");
                ManagementObjectCollection devices = searcher.Get();
                foreach (ManagementObject device in devices)
                {
                    LogUtil.info("devices : " + device.Path.Path);
                    cameraCount++;
                }

            }
            catch (Exception ex)
            {
                LogUtil.error("出错:" + ex.ToString());
            }
            LogUtil.info("Number of built-in cameras: " + cameraCount);
            return cameraCount;
        }
        public static void pythonDetector4(string[] strArr)
        {
          
        }
        private static void p_OutputDataReceivedText(object sender, DataReceivedEventArgs e)
        {
            if (!string.IsNullOrEmpty(e.Data))
            {
                if (e.Data.EndsWith("200"))
                {
                    LogUtil.debug("pyLog: " + e.Data);
                }
                else
                { 
                    LogUtil.info("pyLog: " + e.Data);
                }
            }
        }

        public static void StopClient()
        {
            try
            {
                if (process != null)
                {
                    if (!process.HasExited)
                    {
                        process.Kill();

                        LogUtil.info($"停止{"defMTest.py"} ");
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("出错:" + ex.ToString());
            }

        }
    }
}