わかりました、私は足を踏み鳴らしたり、私がしていることの周りで踊ったりするつもりはありません. 率直に言って、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 がこの効果を達成するのを見てきたため、これが可能であることはわかっています (ポップアップ ウィンドウはなく、完全な出力がリアルタイムでコンソール ウィンドウに書き込まれます)。