2013-10-03 108 views
0

我打電話在C#中的外部EXE Visual Studio 2010。我有一個背景工作者和一個進度條。我想要將執行外部exe的開始執行到exe執行結束時的進度條動畫化。我的代碼是Backgroundworker和進度條動畫與外部EXE的進展

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 

     Process p = new Process(); 
     p.StartInfo.FileName = "d:\\fix.exe"; 
     p.StartInfo.Arguments = "-l"; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.CreateNoWindow = false; 
     p.EnableRaisingEvents = true; 
     p.Start(); 
     p.BeginOutputReadLine(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     progressBar1.Value = e.ProgressPercentage; 
    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

    } 

如何控制進度條,請指引我

+1

實現這將取決於exe的輸出以及解析它的能力來查找實際進度。沒有更多的信息,我們無法真正幫助你。 – Ashigore

+1

您打算如何獲取有關外部可執行進度的信息?有沒有任何回調,或者有什麼常見的地方可以尋找進展?就像可執行文件將其進度寫入公共數據庫,寫入常見日誌文件,寫入MSMQ一樣? – Anand

+0

它是一個控制檯應用程序,在控制檯上打印一個簡單的消息,但隨機時間後 – WiXXeY

回答

0

要回答你的問題,我怎麼能控制進度,這樣

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     Backgroundworker bgw = ctype(sender,backgroundworker); 
     Process p = new Process(); 
     p.StartInfo.FileName = "d:\\fix.exe"; 
     p.StartInfo.Arguments = "-l"; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.CreateNoWindow = false; 
     p.EnableRaisingEvents = true; 
     p.Start(); 
     // report progress by calling reportprogress() 
     bgw.ReportProgress('Integer value to be passed and used for the progressbar') 
     p.BeginOutputReadLine(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     progressBar1.Value = e.ProgressPercentage.ToString(); 
    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

    } 

現在,由於修復.exe不在可以遞增值的循環中,它很難有準確的peogressbar。一個想法,如果你absolutley必須有它的話,

  1. 設置進度最大值10個
  2. 使用TE bgw.ReportProgress()在幾個步驟在DoWork的事件

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
        { 
         Backgroundworker bgw = ctype(sender,backgroundworker); 
         Process p = new Process(); 
         p.StartInfo.FileName = "d:\\fix.exe"; 
         // report progress by calling reportprogress() 
         bgw.ReportProgress(2); 
         p.StartInfo.Arguments = "-l"; 
         p.StartInfo.UseShellExecute = false; 
         // report progress by calling reportprogress() 
         bgw.ReportProgress(5); 
         p.StartInfo.RedirectStandardOutput = true; 
         p.StartInfo.CreateNoWindow = false; 
         p.EnableRaisingEvents = true; 
         p.Start(); 
         // report progress by calling reportprogress() 
         bgw.ReportProgress(7); 
         p.BeginOutputReadLine(); 
        } 
    
        private void button1_Click(object sender, EventArgs e) 
        { 
         progressBar1.Maximum = 10 
         backgroundWorker1.RunWorkerAsync(); 
        } 
    
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
        { 
         progressBar1.Value = e.ProgressPercentage.ToString(); 
        } 
    
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
        { 
    
         progressBar1.Value = 10; 
        } 
    

這將以某種方式增加進度條,但進度總是看起來一樣。

+0

它的一個好主意 – WiXXeY

+0

好酷,讓我知道它是否工作! –

+0

而且,它是否按照您的希望工作? –