2013-05-16 84 views
0

我的程序運行在cmd.exe的批處理文件,讀完後我要顯示一個消息框,以用戶說Finished in #.## seconds獲取時間需要幾秒鐘完成?

我重定向輸出CMD使用process.BeginOutputReadLine()一個文本框,這是我試過的代碼:

if (e.Data == null) 
{ 
    string time = process.TotalProcessorTime.Seconds.ToString(); 
    MessageBox.Show("Finished in " + time + " seconds"); 
} 

完成該過程耗時約7-15秒,但MessageBox顯示爲Finished in 0 seconds

如何在幾秒鐘內完成準確完成所需時間?

+0

[使用'Stopwatch'對象(http://msdn.microsoft.com/en-us的頂部聲明它的本地方法以外/library/system.diagnostics.stopwatch.aspx) –

+0

而不是使用字符串concat使用'string.Format'並使用'{0}傳遞參數'我也給你提供了一個簡單的答案 – MethodMan

回答

11
Stopwatch watch = new Stopwatch(); 
watch.Start(); 
//Do things 
watch.Stop(); 
Text = watch.Elapsed.TotalSeconds.ToString(); 
+0

正是我想要的。阿列克謝和DJ克拉澤的回答也非常有幫助。 – Abraham

0

你應該看看Stopwatch類。你需要在你的過程開始之前啓動秒錶,然後停下來獲取經過的時間。

1

只是基本的Stopwatch應該是足夠的。

Stopwatch stopWatch = new Stopwatch(); 
stopWatch.Start(); 

// run external process, if asynchronous - 
//store stopWatch in member variable instead of local 

stopWatch.Stop(); 
TimeSpan ts = stopWatch.Elapsed; 

注意TotalProcessorTime措施CPU使用時間,這很可能爲0秒的CMD.exe因爲它確實沒有做太多。

+0

完美,但有沒有什麼辦法刪除毫秒?我只想整秒。 – Abraham

+0

@Abraham - [TimeSpan.TotalSeconds](http://msdn.microsoft.com/en-us/library/system.timespan.totalseconds.aspx)可能是你想要的。查看[TimeSpan的格式選項](http://msdn.microsoft.com/zh-cn/library/dd992632.aspx),因爲它可能完全符合您的需求 –

0

你試過process.ExitTime.Subtract(process.StartTime).TotalSeconds

修改爲添加:請注意,如果您在退出過程之前嘗試使用該功能,將會收到異常。每the documentationExitTime,使用HasExited屬性,如果您有任何疑問是否是這種情況。

0

啓動進程時應使用Stopwatch類。

在此過程中,爲Exited事件添加一個事件處理程序,並在處理完成時停止秒錶並檢索時間。

class Foo 
{ 
    Stopwatch watch = new Stopwatch(); 

    public void RunProcess(Process process) 
    { 
     process.Exited += new EventHandler(ProcessExit); 

     process.Start(); 
     watch.Start(); 
    } 

    public void ProcessExit(object sender, EventArgs e) 
    { 
     watch.Stop(); 
    } 
} 
1

難道你最終做這樣的事情,如果它可以更容易地閱讀你

var procTime = DateTime.Now - Process.GetCurrentProcess().StartTime; 
var procTimeInSec = procTime.Seconds; 
MessageBox.Show(string.Format("Finished in {0} seconds", procTimeInSec)); 

訪問可能要改變兩個`VAR局部變量是從訪問在本地範圍之外。

下面

是你如何將在類

public static TimeSpan procTime = new TimeSpan(); 
    var procTimeInSec, can still be declared in the local scope 
+0

在我的事件中無法訪問ProcTime,因爲它是用另一種方法聲明的。 – Abraham

+0

您不能將進程存儲在成員變量中的開始時間..?你可以澄清,或者說明它是如何被聲明的,這可能有助於解決你的問題。另外'Process.GetCurrentProcess'應該可以在整個應用程序中訪問..在我的例子中,procTime是本地作用域。我將編輯並解釋什麼類型的var變量應該明確聲明爲 – MethodMan

+0

我有一個button1.Click事件啓動Process,我在那裏聲明var,然後我將cmd輸出異步地重定向到一個文本框,所以在事件process.OutputDatReceived,在e.Data == null之後,我使用完成所需的時間調用MessageBox。 – Abraham