Waitforexit interrupt my running application in unity

后端 未结 2 622
伪装坚强ぢ
伪装坚强ぢ 2020-12-21 22:11

I\'m trying to run an exe application in unity to perform some function and that exe file will take an input from my microphone when running in unity so i must wait until it

相关标签:
2条回答
  • 2020-12-21 22:52

    Thanks guys but i found the final solution that works well here. it will save your time

    https://www.youtube.com/watch?v=C5VhaxQWcpE

    this my code after applying the solution :-

    And this my code after applying the solution in the video above

    public async void run_speechToText()

    {
        Task task = new Task(StartListening);
        task.Start();
        Debug.Log("My exe file is running right now");
        await task;
        get_answer();
    }
    
    public void StartListening()
    {
        p.StartInfo = new System.Diagnostics.ProcessStartInfo("E:\\app\\dist\\app.exe");
        p.StartInfo.WorkingDirectory = @"\Assets\\app\\dist\\app.exe";
        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        p.Start();
        p.WaitForExit();
    
    }
    
    0 讨论(0)
  • 2020-12-21 22:54

    You don't have to use WaitForExit since it's blocking the main Thread. There are two workarounds for your issue:

    1.Set EnableRaisingEvents to true. Subscribe to the Exited event and use that to determine when the opened program has closed. Use a boolean flag to determine if it is still opened or not in the Update function.

    bool processing = false;
    
    void Start()
    {
        processing = true;
    
        Process p = new Process(); ;
        p.StartInfo = new System.Diagnostics.ProcessStartInfo("E:\\app\\dist\\app.exe");
        p.StartInfo.WorkingDirectory = @"\Assets\\app\\dist\\app.exe";
        p.StartInfo.CreateNoWindow = true;
        p.EnableRaisingEvents = true;
        p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        p.Exited += new EventHandler(OnProcessExit);
        p.Start();
    }
    
    private void OnProcessExit(object sender, EventArgs e)
    {
        processing = false;
    }
    
    
    void Update()
    {
        if (processing)
        {
            //Still processing. Keep reading....
        }
    }
    

    2.Continue with your WaitForExit but only use that code in a new Thread so that it doesn't block or freeze Unity's main Thread.

    //Create Thread
    Thread thread = new Thread(delegate ()
    {
        //Execute in a new Thread
        Process p = new Process(); ;
        p.StartInfo = new System.Diagnostics.ProcessStartInfo("E:\\app\\dist\\app.exe");
        p.StartInfo.WorkingDirectory = @"\Assets\\app\\dist\\app.exe";
        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        p.Start();
        p.WaitForExit();
    
        //....
    });
    //Start the Thread and execute the code inside it
    thread.Start();
    

    Note that you can't use Unity's API from this new Thread. If you want to do so, use UnityThread.executeInUpdate. See this for more information.

    0 讨论(0)
提交回复
热议问题