2011-12-15 15 views
1

私のアプリケーションでは、isoを他のファイル形式に変換する外部コマンドラインツールを呼び出します。今、私はisoコンバータを呼び出し、それはバックグラウンドで実行されます。コマンドラインを介してisoコンバータを実行すると、何をしているのかがわかりますが、アプリケーションではバックグラウンドで実行されます。VB.NET他のアプリケーションからライブ状態を取得する

これは、isoconverterがテキストボックスで行われた後の状態を示しています。これを変更してライブステータスを表示するにはどうすればいいですか?私はコマンドラインツールに表示されるように?

これは私がisoconverterを実行するために呼び出すコードです。

Private Sub GETCMD3() 
    Dim CMDprocess As New Process 
    Dim StartInfo As New System.Diagnostics.ProcessStartInfo 
    StartInfo.FileName = "cmd" 
    StartInfo.CreateNoWindow = True 
    StartInfo.RedirectStandardInput = True 
    StartInfo.RedirectStandardOutput = True 
    StartInfo.UseShellExecute = False 
    CMDprocess.StartInfo = StartInfo 
    CMDprocess.Start() 
    Dim SR As System.IO.StreamReader = CMDprocess.StandardOutput 
    Dim SW As System.IO.StreamWriter = CMDprocess.StandardInput 
    SW.WriteLine("Isoconvert.exe " & txtIsoFile.Text) 
    SW.WriteLine("exit") 
    txtIsoOutput.Text = SR.ReadToEnd 
    SW.Close() 
    SR.Close() 
End Sub 

答えて

2

あなたの現在のコードの問題は、それが完了するまで、これはコマンドの標準出力ストリームを読んでいるライン

txtIsoOutput.Text = SR.ReadToEnd 

です。完了すると、結果がテキストボックスに割り当てられます。

StreamReader.ReadLineまたはおそらくReadBlockを使用して、少しずつStreamReaderから読むことをお勧めします。以下のような

何か:

Dim line as String 
Do 
    line = SR.ReadLine() 
    If Not (line Is Nothing) Then 
     txtIsoOutput.Text = txtIsoOutput.Text + line + Environment.NewLine 
    End If 
Loop Until line Is Nothing 

は、これはおそらく、しかし、十分ではありません。ユーザーインターフェイススレッドはコマンド出力を処理するためにビジー状態になっているため、TextBoxはその表示を更新する機会を得られません。これを修正する最も簡単な方法は、テキストを変更した後にApplication.DoEvents()を追加することです。ただし、GETCMD3が起動したときにGETCMD3を呼び出すボタン/メニューを無効にしてください。

+0

これは完璧に動作します。正確に私が感謝のために探していたものです。 – PandaNL

+0

いくつかのテストの後、実際にはCPUを70%、80%にプッシュしますが、どうすればこの問題をapplication.doeventsで解決できますか? – PandaNL

+0

ループ内で 'System.Threading.Thread.Sleep(100)'への呼び出しを追加して、毎回1​​00ミリ秒(0.1秒)待つことができます。これにより、ストリームから毎秒10回読み取られ、ほとんどの時間CPUが解放されます。このような高速更新レートが不要な場合は、スリープ時間を長くしてCPU使用量を減らすことができます。 – Justin

0

おそらくプロセススレッドにアクセスして状態を確認していませんか?このような

何か:

CMDprocess.Threads(0).ThreadState = ThreadState.Running 
+0

このコードはどのように使用できますか?申し訳ありませんがVBの初心者です – PandaNL

+0

このリンクが見つかりましたhttp://support.microsoft.com/kb/173085/しかし、私は自分のコードでそれを実装する方法がわかりません。 – PandaNL

+0

@PandaNL - そのリンクはVB6用です(「アプリケーション」をクリックするとわかります)。これはVB.NETとはまったく異なる言語です。 – Justin

1

[Offtopic]私はあなたのコードを見直していましたが、おそらくIsoconvert.exeを起動できる方法でより良いaproachが見つかりました。

私が間違っていない場合は、コンソールコマンドを起動することなく、startinfoを使用してIsoconvert.exeを起動できます。

Dim CMDprocess As New Process 
Dim StartInfo As New System.Diagnostics.ProcessStartInfo 
StartInfo.FileName = "Isoconvert.exe" 
StartInfo.Arguments = txtIsoFile.Text 
CMDprocess.StartInfo = StartInfo 
CMDprocess.Start() 

私はあなたがまだstdinとstdoutを読み書きできると思います。

関連する問題