2012-04-04 118 views
2

我試圖在窗口中獲取以毫秒爲單位的經過時間。我發現要做到這一點的唯一方法是使用FILETIME結構獲得1601年以來的100納秒數。但是FILETIME結構會將值存儲在兩個變量中,我想知道如何減去這兩個結構,將它們除以10000(以獲得毫秒)並將結果存儲在單個變量中 我正在使用C++ Visual Studio 2008速成版如何減去兩個FILETIME?

+2

編程語言?框架? – 2012-04-04 10:38:21

+0

對不起,我以爲我已經把它。我正在使用Visual Studio 2008 Express版的C++ – XaitormanX 2012-04-04 10:49:35

+1

IMO這是一個完全合法的問題和答案,目前的措辭。它應該重新打開。 – 2014-04-04 16:32:53

回答

4

閱讀的FILETIME文檔:

不建議您從FILETIME結構加減值來獲得相對時間。相反,你應該的文件時,低和高位部分複製到一個ULARGE_INTEGER結構,執行QuadPart成員在64位運算,並複製LowPartHighPart成員進入FILETIME結構體。

在那裏你也有你的單一號碼(ULARGE_INTEGER結構的QuadPart)。

+0

+1,這就是問題如何解決。 – sharptooth 2012-04-04 10:58:35

+0

好的,謝謝你,解決了這個問題。但它表示,如果編譯器支持內置64位整數,則只能使用QuadPart。 Visual Studio支持它,但是當我製作可執行文件時,它可以在安裝了Windows的任何系統中工作? – XaitormanX 2012-04-04 11:06:14

+0

根據定義,可執行文件本身不再依賴於編譯器。 – Joey 2012-04-04 11:18:02

0
FILETIME ft1; 
FILETIME ft2; 

int iDifferenceInMS = (*((ULONGLONG*)&ft2) - *((ULONGLONG*)&ft1))/10000; 
+2

這實際上可能非常糟糕。 FILETIMES是32位對齊的,而不是64位對齊的。這意味着,取決於編譯器將變量放在內存中的位置,並取決於系統。這意味着在某些機器上運行時可能會崩潰。你不想要這種悲傷。 另一方面,ULARGE_INTEGER需要64位對齊,所以你不會得到這些對齊錯誤。 – Eagle 2014-08-08 22:03:00