unity 判断进程是否挂了,挂了就重启(打开文件,查找进程,延后几秒调用函数)

代码如下:

    void Update()
    {
        if (clientScene.msgCount > preMsgCount)     //长时间没有得到进程的反馈
        {
            preMsgCount = clientScene.msgCount;
            recentGetMsgTick = Time.time;
        }

        if (Time.time > recentGetMsgTick + maxNoMsg)    //长时间没有得到进程的额反馈超过一定时间,说明进程死掉了
        {
            if (CheckProcess(pname))                     //进程存在就杀死并重启
            {
                KillProcess(pname);
                Invoke("StartProcess", 2.0f);           //隔2秒再调用该函数
            }
            else                                        //不存在就开启
            {
                StartProcess();
            }

            recentGetMsgTick = Time.time + clientIdleTime;
        }
    }

    /// <summary>
    /// 开启应用
    /// </summary>
    void StartProcess()
    {
        UnityEngine.Debug.Log("打开本地应用");
        Application.OpenURL(exe_path);

        NoteReStart();
    }


    /// <summary>
    /// 检查应用是否正在运行
    /// </summary>
    bool CheckProcess(string processName)
    {
        bool isRunning = false;
        Process[] processes = Process.GetProcesses();
        int i = 0;
        foreach (Process process in processes)
        {
            try
            {
                i++;
                if (!process.HasExited)
                {
                    if (process.ProcessName.Contains(processName))
                    {
                        UnityEngine.Debug.Log(processName + "正在运行");
                        isRunning = true;
                        continue;
                    }
                    else if (!process.ProcessName.Contains(processName) && i > processes.Length)
                    {
                        UnityEngine.Debug.Log(processName + "没有运行");
                        isRunning = false;
                    }
                }
            }
            catch
            {
                UnityEngine.Debug.Log("进程检测异常");
            }
        }
        return isRunning;
    }

    /// <summary>
    /// 杀死进程
    /// </summary>
    /// <param name="processName">应用程序名</param>
    void KillProcess(string processName)
    {
        Process[] processes = Process.GetProcesses();
        foreach (Process process in processes)
        {
            try
            {
                if (!process.HasExited)
                {
                    if (process.ProcessName == processName)
                    {
                        process.Kill();
                        UnityEngine.Debug.Log("已杀死进程");
                    }
                }
            }
            catch (System.InvalidOperationException)
            {
                UnityEngine.Debug.Log("关闭进程异常");
            }
        }
    }

 

posted @ 2020-09-28 10:37  werky  阅读(967)  评论(0编辑  收藏  举报