C # - захват вывода из дочернего окна нового процесса - PullRequest
0 голосов
/ 20 марта 2012

Ладно, я не собираюсь шутить и танцевать вокруг того, что я делаю. Сразу, я пытаюсь сделать компилятор UnrealScript с графическим интерфейсом для Unreal Development Kit в C #. Точная природа для чего-то большего, но вот что происходит:

Я запускаю новый поток, который запускает новый процесс, и настраиваю потоковый считыватель, у которого есть прослушиватель для захвата вывода при его записи в окно консоли. Это не проблема, за исключением того факта, что при запуске 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, которое висит там вообще без вывода данных, казалось бы, навсегда.

Есть ли у кого-нибудь понимание того, как настроить мой стример для захвата фактического результата? Я знаю, что это возможно, потому что я видел, что другие IDE для UnrealScript достигли этого эффекта (нет всплывающих окон, полный вывод записывается в режиме реального времени в окно консоли) Я чувствую, что я близко, но я просто еще не совсем там ...

1 Ответ

1 голос
/ 21 марта 2012

Попробуйте запустить UDK.com make.Это запустит компилятор в том же окне, из которого вы его запускаете.

...