C# - 从新进程的子窗口捕获输出

时间:2012-03-20 07:14:55

标签: c# c#-4.0 visual-c#-express-2010 unreal-development-kit unrealscript

好吧,我不会嘻嘻哈哈地跳来跳去做我正在做的事情。 直接,我试图在C#中为虚幻开发工具包制作一个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实现了这个效果(没有弹出窗口,实时写入控制台窗口的完整输出) 我能感觉到我很亲近,但我还没有到那里......

1 个答案:

答案 0 :(得分:1)

尝试运行UDK.com make。这将在您从中启动它的同一窗口中运行编译器。