2012-04-11 21 views
4

我想爲WinRT編譯Boost 1.49.0。我已經將它歸結爲一種方法:GetSystemInfo(),它用於boost :: thread :: hardware_concurrency()來獲取系統上邏輯處理器的數量。如何獲取WinRT上邏輯CPU的數量?

我還沒有在WinRT中找到任何替代品。

有沒有其他方法可以使用?

+1

請注意,Visual C++ 11支持C++ 11線程和原子庫;你可以考慮使用它來代替Boost.Thread。這些庫非常相似。 – 2012-04-13 00:46:21

+0

謝謝!這是爲了編譯現有的跨平臺項目,可以使用TBB,Poco或Boost.Threads。 Boost.Threads是唯一可以輕鬆移植的(這是我唯一沒有找到WinRT替代品的唯一方法)。 – Cygon 2012-04-13 10:30:24

回答

10

您可以調用Metro API應用程序允許的Windows API函數GetNativeSystemInfo

+0

這是真的,但主是不可發現的。 – 2012-04-13 00:13:58

+0

哇,我不知道。你是怎麼找到這個的? – 2012-04-13 04:38:26

+4

@PatrickKlug:我對這個API函數很熟悉,這是一個幸運的猜測:-)。理論上,所有可從Metro風格應用程序訪問的Windows API函數都列在[Windows開發人員中心的此部分]中(http://msdn.microsoft.com/zh-cn/library/windows/apps/br205757)。實際上列出了這個特定功能(在「系統」下)。不過,我不知道列表是多麼完整。不過,WinAPI中還有很多好東西仍然可用。另外,整個C和C++標準庫組件都是可用的,這也是非常有用的。 – 2012-04-13 06:07:24

3

似乎沒有一種簡單的方法可以在WinRT中獲取這些信息。如果你只是想知道處理器架構,那麼你可以使用Windows.System.ProcessorArchitecture,但是這不會告訴你有多少邏輯CPU可用。 Windows.System.Threading也不會告訴你這些信息。

要獲得有關物理CPU的信息,我在MSDN論壇上找到了this question,這表明我們可以使用DeviceEnumeration來獲取此信息。通過使用GUID_DEVICE_PROCESSOR({97FADB10-4E33-40AE-359C-8BEF029DBDD0})的GUID,可以枚舉所有處理器。

在Javascript中這應該是這個樣子 - 一個C++例子請參見MSDN上Device Enumeration例如:

Windows.Devices.Enumeration.DeviceInformation.findAllAsync('"System.Devices.InterfaceClassGuid:="{97FADB10-4E33-40AE-359C-8BEF029DBDD0}""') 
.then(function (info) { 
    for (var i = 0; i < info.length; i++) { 
     var device = info[i]; 
    } 
}); 

在我的機器這給了我各種設備,聲卡,PCI和USB處理器這樣的我不知道是否有更好的辦法是拿到CPU,但我沒有得到的信息是什麼CPU我有

"Intel(R) Core(TM) i7 CPU  Q 740 @ 1.73GHz" 

不幸的是這個信息似乎並沒有包含一個簡單的標誌,告訴你多少的CPU,因此我認爲這將是困難的得到許多邏輯CPU。我建議你在MSDN論壇上提問。他們通常相當敏感。

+0

我會留下這個答案,以防在搜索中如何找到處理器信息時出現此問題。 – 2012-04-20 00:26:56

+1

我剛剛在C#中得到了這個工作,並且它返回的結果是邏輯核心的一個結果。例如。我的Core i7 950返回8個結果,每個結果都具有相同的名稱。在上面使用guid的例子中,info.length是核心的數量。 – Adrian 2012-11-07 10:53:08

0

System.Environment.ProcessorCount應該爲您提供核心數量。