Waitforexit прервет мое работающее приложение в единстве - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь запустить приложение exe в единстве, чтобы выполнить некоторую функцию, и этот файл exe примет вход от моего микрофона при работе в единице, поэтому я должен ждать, пока он выйдет, используя waitforexit. но это нехорошо, потому что мое приложение для единства во время запуска exe останавливается до тех пор, пока не закончится мой exe, и я хочу выполнить что-то еще в единстве во время выполнения exe.

это мой код: -

System.Diagnostics.Process p = новый System.Diagnostics.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();

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Спасибо, ребята, но я нашел окончательное решение, которое хорошо работает здесь. это сэкономит ваше время

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

это мой код после применения решения: -

А это мой код после применения решения в видео выше

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 голосов
/ 28 апреля 2018

Вам не нужно использовать WaitForExit, так как он блокирует основной поток. Для вашей проблемы есть два обходных пути:

1 . Установите EnableRaisingEvents до true. Подпишитесь на событие Exited и используйте его для определения момента закрытия открытой программы. Используйте логический флаг, чтобы определить, открыт он или нет в функции Update.

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 . Продолжайте работу с WaitForExit , но используйте этот код только в новом Thread, чтобы он не блокировал и не блокировал основной поток Unity.

//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();

Обратите внимание, что вы не можете использовать API Unity из этой новой темы. Если вы хотите сделать это, используйте UnityThread.executeInUpdate. См. this для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...