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