好吧,我不会四处闲逛并围绕我在做什么跳舞。直截了当,我正在尝试为 C# 中的 Unreal Development Kit 制作 GUI UnrealScript 编译器。确切的性质是为了更大的东西,但这就是正在发生的事情:
我启动一个新线程来启动一个新进程,并设置一个流读取器,该流读取器具有一个侦听器,以在将输出写入控制台窗口时捕获输出。这不是问题,除了在启动时UDK.exe make
它似乎会产生一个子控制台窗口,这就是实际的编译器。如果我CD
转到我的UDK/Binaries/Win32
目录并执行命令,UDK.exe make >> output.txt
绝对不会写入任何内容,但会创建文件(当然编译器也会运行)
我正在使用(据我所知)线程安全操作来访问我想在编译器运行时写入的输出文本框。
这是我的代码:
public partial class ProjectEditor : Form
{
delegate void SetTextCallback(string text);
/*** ... other completely unrealted code ... ***/
private void Menu_Project_Compile_JustCompile_Click(object sender, EventArgs e) {
Thread compile = new Thread(
new ThreadStart (
this.Compile
)
);
NewConsoleLine("Starting Compiler New");
compile.Start();
}
////////
private void Compile() {
this.RunWithRedirect(FileMan.getUDK(), " make");
}
void RunWithRedirect(string cmdPath, string args = null) {
var proc = new Process();
proc.StartInfo.FileName = cmdPath;
proc.StartInfo.Arguments = args;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.EnableRaisingEvents = true;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.UseShellExecute = false;
proc.ErrorDataReceived += proc_DataReceived;
proc.OutputDataReceived += proc_DataReceived;
proc.Start();
proc.BeginErrorReadLine();
proc.BeginOutputReadLine();
proc.WaitForExit();
}
void proc_DataReceived(object sender, DataReceivedEventArgs e) {
NewConsoleLine(e.Data);
}
void NewConsoleLine(String text) {
if (this.OutputConsole.InvokeRequired) {
SetTextCallback d = new SetTextCallback(NewConsoleLine);
this.Invoke(d, new object[] { text });
} else {
OutputConsole.Text += text + "\n";
}
}
}
目前,当我执行编译方法时,我的控制台被写入该行Starting Compiler New
并出现一个 UDK.exe 控制台窗口,并且似乎永远挂在那里,根本没有输出。
有没有人知道如何调整我的流媒体以捕获实际输出?我知道这是可能的,因为我已经看到 UnrealScript 的其他 IDE 实现了这种效果(没有弹出窗口,实时写入控制台窗口的完整输出)我可以感觉到我已经接近了,但我还没有完全到那里......