【发布时间】:2018-08-31 18:21:26
【问题描述】:
我有一个 Unity 应用程序,它创建了一个尝试通过 adb shell 向 Android 设备发送命令的进程。我能够在应用程序的过程中发送命令。但我第一次只收到来自 Android 设备的输出。我不知道它是否是 OutputDataReceived 的缓冲区问题。输入通过,但我在 Unity 编辑器上没有收到任何日志。如果我将 Process.StartInfo.CreateNoWindow 设置为 true,我可以在 Unity 外部生成的 adb shell 中看到所有输出。第一次执行后,输出不会从该控制台重定向到 Unity。
public void StartShellProcessAsync ()
{
ShellThread = new Thread(() =>
{
ShellProcess = new Process();
ShellProcess.StartInfo.FileName = "adb.exe";
ShellProcess.StartInfo.Arguments = "shell";
ShellProcess.StartInfo.CreateNoWindow = false;
ShellProcess.StartInfo.UseShellExecute = false;
ShellProcess.StartInfo.RedirectStandardOutput = true;
ShellProcess.StartInfo.RedirectStandardError = true;
ShellProcess.StartInfo.RedirectStandardInput = true;
ShellProcess.EnableRaisingEvents = true;
ShellProcess.OutputDataReceived += new DataReceivedEventHandler(OnOutputDataReceived);
ShellProcess.ErrorDataReceived += new DataReceivedEventHandler(OnErrorDataReceived);
ShellProcess.Exited += new EventHandler(OnProcessExited);
ShellProcess.Start();
ShellProcess.BeginOutputReadLine();
ShellProcess.BeginErrorReadLine();
ShellProcess.WaitForExit();
});
ShellThread.Start();
}
我在 Unity 中有发送如下命令的按钮:
am start -m <application activity>
am stack list
我正在尝试从am stack list 读取输出,如果它是我发出的第一个命令,它就可以工作。但是如果我在am start -m <application activity> 之后运行它,则输出不会传递到 Unity。
我在线程中运行 ShellProcess 的原因是让进程在整个应用程序执行期间保持打开状态。我不想为我发送到 Android 的每个命令生成一个新进程,因为它很耗时。
【问题讨论】:
标签: c# .net multithreading unity3d process