2016-06-23 3 views
0

EDIT:ありがとうlunarquakerのヘルプ。以下は、承認済みの回答のsetLabelメソッドを使用した作業コードです。変数「差出人」と「e」は「sender2」と、このため、すでに「差出人」と「e」の変数C言語のラベルへの出力コマンドラインの応答

 Process process = new Process(); 
     string command = @"/K C:\ti\uniflash_3.4\uniflashCLI.bat -config C:\users\david\desktop\twinHM\TTwin9V.usf -setOptions com=3 -operations program"; 
     process.StartInfo.FileName = "CMD.exe"; 
     process.StartInfo.Arguments = command; 
     process.StartInfo.RedirectStandardOutput = true; 
     process.StartInfo.UseShellExecute = false; 
     process.StartInfo.CreateNoWindow = true; 
     process.OutputDataReceived += (sender2, e2) => setLabelText(lblCMDResponse, e2.Data); 
     lblCMDResponse.Visible = true; 
     process.Start(); 
     process.BeginOutputReadLine(); 

とsetLabelを使用していたボタンの内部で起こっていた「E2」に変更されましたメソッド

private void setLabelText(Label label, string text) 
    { 
     if (label.InvokeRequired) 
     { 
      label.Invoke((System.Action)(() => setLabelText(label, text))); 
     } 
     else 
     { 
      label.Text = text; 
     } 
    } 

私は、パラメータファイルの作成を処理し、そのファイルとバイナリをマイクロプロセッサに点滅させるC#アプリケーションを作成しています。バックエンドでは、私は実際にフラッシュを行うためにuniflashコマンドラインツールを使用していますが、私は(それはそれらを恐れると思うので)私のユーザーから "コンピュータ"または "ハイテク"に見えるものを隠したい私はCMDを実行しているときに非表示にしたいのですが、同じ理由でコンソールを開いて表示したくないのですが、CMDからの応答を取得して、その応答を私のユーザーに表示されます。ほとんどの場合、このラベルはユーザーが読むことができないほど速く変化することが予想されますが、問題が発生した場合に警告を表示します(主デバイスが接続され、スイッチがFTDIに設定されていることを確認しています)

これを行う方法を理解するのに問題があります。

これは私がこれまでのところ、そのセクションでやっているものです:

Process process = new Process(); 
string command = @"/K C:\ti\uniflash_3.4\uniflashCLI.bat -config C:\users\david\desktop\twinHM\TTwin9V.usf -setOptions com=3 -operations program"; 
process.StartInfo.FileName = "CMD.exe"; 
process.StartInfo.Arguments = command; 
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
process.Start(); 

私が開始する前に、私はOutputDataRecievedイベントをサブスクライブし、何とか私のラベルに設定する必要があることを知っています。私は例としてthis threadを使用していましたが、プラグインしようとすると、(送信側、e)部分について文句を言います。なぜなら、それらは見つけることができる変数ではないからです。私はまた、Console.WriteLine(stuff)はラベルのテキストプロパティを設定するだけではなく、最新のメッセージでラベルを更新し続ける方法がわからないことを認識しました。

I OutputDataReceivedのドキュメントを読んで、私が何が間違っているのかを理解できるかどうかを確認していますが(誰かがここで回答しない限り)、私は実際にそのラベルを付けるための助けに感謝します(あるいは、テキストプロパティへの出力?)

答えて

0

多分私は何かを逃しています。 InvokeRequiredチェックでsetLabelTextメソッドを作成することはできませんか?まず、OutputDataReceivedイベントへのサブスクリプションあなたがラベルを設定する方法とそれを関連付けます、そして、

process.OutputDataReceived += (sender, e) => setLabelText(myLabel, e.Data); 

ラベルを更新する方法:

private void setLabelText(Label label, string text) 
    { 
     if (label.InvokeRequired) 
     { 
      label.Invoke((System.Action)(() => setLabelText(label, text))); 
     } 
     else 
     { 
      label.Text = text; 
     } 
    } 
+0

は、私は、Invokeに不慣れでした。これは私にとって完璧に働いています、ありがとう。 – David

関連する問題