我正在尝试以统一运行exe应用程序来执行某些功能,并且exe文件将在我的麦克风输入时以单位运行,所以我必须等到它退出,而使用waitforexit很好,允许exe输入但这并不好,因为我在运行期间的统一应用程序会停止,直到我的exe完成,我想在我的exe运行时执行其他的统一。
这是我的代码: -
System.Diagnostics.Process p = new 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();
答案 0 :(得分:2)
您不必使用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();
请注意,您无法使用此新线程中的Unity API。如果您想这样做,请使用UnityThread.executeInUpdate
。有关详细信息,请参阅this。
答案 1 :(得分:0)
谢谢大家,但我发现最终解决方案在这里运作良好。 它会节省你的时间
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();
}