PowerGridForecast 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
包含裝置所連線電源網格線的相關信息。 數據是用來預測工作負載發生的時間移轉,或在密集時間減少能源耗用量。
public ref class PowerGridForecast sealed
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Devices.Power.PowerGridApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class PowerGridForecast final
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Devices.Power.PowerGridApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class PowerGridForecast
Public NotInheritable Class PowerGridForecast
- 繼承
- 屬性
Windows 需求
裝置系列 |
Windows Desktop Extension SDK (已於 10.0.26100.0 引進)
|
API contract |
Windows.Devices.Power.PowerGridApiContract (已於 v1.0 引進)
|
範例
using Windows.Devices.Power;
void PrintBestTimes(PowerGridForecast forecast)
{
double bestSeverity = double.MaxValue;
double bestLowImpactSeverity = double.MaxValue;
DateTime bestTime = DateTime.MaxValue;
DateTime bestLowImpactTime = DateTime.MaxValue;
TimeSpan blockDuration = forecast.BlockDuration;
DateTime startTime = forecast.StartTime;
IList<PowerGridData> forecastSignals = forecast.Forecast;
if (forecastSignals.Count == 0)
{
Console.WriteLine("Error encountered with getting forecast; try again later.");
return;
}
foreach (PowerGridData data in forecastSignals)
{
if (data.Severity < bestSeverity)
{
bestSeverity = data.Severity;
bestTime = startTime;
}
if (data.IsLowUserExperienceImpact && data.Severity < bestLowImpactSeverity)
{
bestLowImpactSeverity = data.Severity;
bestLowImpactTime = startTime;
}
startTime = startTime + blockDuration;
}
if (bestLowImpactTime != DateTime.MaxValue)
{
DateTime endBestLowImpactTime = bestLowImpactTime + blockDuration;
Console.WriteLine($"Lowest severity during low impact is {bestLowImpactSeverity}, which starts at {bestLowImpactTime.ToString()}, and ends at {endBestLowImpactTime}.");
}
else
{
Console.WriteLine("There's no low-user-impact time in which to do work.");
}
if (bestTime != DateTime.MaxValue)
{
DateTime endBestSeverity = bestTime + blockDuration;
Console.WriteLine($"Lowest severity is {bestSeverity}, which starts at {bestTime.ToString()}, and ends at {endBestSeverity.ToString()}.");
}
}
PowerGridForecast forecast = PowerGridForecast.GetForecast();
PrintBestTimes(forecast);
#include "pch.h"
#include <iostream>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Devices.Power.h>
using namespace winrt::Windows::Devices::Power;
using namespace winrt::Windows::Foundation::Collections;
using namespace winrt::Windows::Foundation;
void PrintFullForecast(PowerGridForecast const& forecast)
{
IVectorView<PowerGridData> forecastSignals = forecast.Forecast();
DateTime forecastStartTime = forecast.StartTime();
TimeSpan forecastBlockDuration = forecast.BlockDuration();
DateTime blockStartTime = forecastStartTime;
// On failure the forecast will be empty.
if (forecastSignals.Size() == 0)
{
std::wcout << L"Error encountered while reading the forecast; try again later." << std::endl;
return;
}
// Iterate through the forecast printing all the data.
for (auto const& block : forecastSignals)
{
auto severity = block.Severity();
auto isLowImpact = block.IsLowUserExperienceImpact();
std::wcout << L"Start time - ";
PrintDateTime(blockStartTime, true);
std::wcout << L" | End time - ";
PrintDateTime(blockStartTime + forecastBlockDuration, true);
std::wcout << L" | Intensity - " << severity << L" | IsLowImpactTime - " << (isLowImpact ? L"TRUE" : L"FALSE") << std::endl;
blockStartTime = blockStartTime + forecastBlockDuration;
}
}
void PrintBestTimes(PowerGridForecast const& forecast)
{
IVectorView<PowerGridData> forecastSignals = forecast.Forecast();
DateTime forecastStartTime = forecast.StartTime();
TimeSpan forecastBlockDuration = forecast.BlockDuration();
DateTime blockStartTime = forecastStartTime;
// On failure the forecast will be empty
if (forecastSignals.Size() == 0)
{
std::wcout << L"Error encountered while reading the forecast; try again later." << std::endl;
return;
}
DateTime bestSeverityTimeUTC = DateTime::max();
DateTime bestSeverityTimeInLowUserImpactTimeUTC = DateTime::max();
// 1.0 is maximum severity the API can return.
double bestSeverity = 1.0;
double bestSeverityInLowUserImpactTime = 1.0;
// Iterate through the forecast looking for the best times.
for (auto const& block : forecastSignals)
{
auto severity = block.Severity();
auto isLowImpact = block.IsLowUserExperienceImpact();
// Check if there is lower severity
if (severity < bestSeverity)
{
bestSeverity = severity;
bestSeverityTimeUTC = blockStartTime;
}
// Check whether there's a lower severity that's also at a time with low user impact.
if (isLowImpact && severity < bestSeverityInLowUserImpactTime)
{
bestSeverityInLowUserImpactTime = severity;
bestSeverityTimeInLowUserImpactTimeUTC = blockStartTime;
}
blockStartTime = blockStartTime + forecastBlockDuration;
}
// Print out the best times only if they've been set.
if (bestSeverityTimeUTC != DateTime::max())
{
std::wcout << L"Best time to do work is ";
PrintDateTime(bestSeverityTimeUTC, true);
std::wcout << L" with a severity of " << bestSeverity;
std::wcout << L" and ends at ";
PrintDateTime(bestSeverityTimeUTC + forecastBlockDuration, true);
std::wcout << std::endl;
}
if (bestSeverityTimeInLowUserImpactTimeUTC != DateTime::max())
{
std::wcout << L"Best time with low user impact is ";
PrintDateTime(bestSeverityTimeInLowUserImpactTimeUTC, true);
std::wcout << L" with a severity of " << bestSeverityInLowUserImpactTime;
std::wcout << L" and ends at ";
PrintDateTime(bestSeverityTimeInLowUserImpactTimeUTC + forecastBlockDuration, true);
std::wcout << std::endl;
}
else
{
std::wcout << "There's no low-user-impact time in which to do work." << std::endl;
}
}
int main()
{
std::wcout << L"Power Grid Forecast WinRT API sample app." << std::endl;
// Register for the forecast notification.
auto revoker = PowerGridForecast::ForecastUpdated(winrt::auto_revoke, [&](auto, winrt::Windows::Foundation::IInspectable const&) {
std::wcout << L"Forecast updated..." << std::endl;
// Forecast has been updated; find the next best times.
PowerGridForecast forecast = PowerGridForecast::GetForecast();
PrintBestTimes(forecast);
});
// Print out the full forecast.
PowerGridForecast forecast = PowerGridForecast::GetForecast();
PrintFullForecast(forecast);
// Wait until the user presses a key to exit.
std::cout << "Listening to the signal: a new forecast has been created."
"Leave this program open to see when a new forecast is created, otherwise press any key to exit this program..." << std::endl;
std::cin.get();
return 0;
}
備註
Windows 會根據裝置所連接的電源網格線,公開電力網格碳的預測。 例如,Windows Update 已使用此數據,以在更新發生時進行時間轉移,以降低碳量。 此 API 會向您公開這些相同的預測,以便減少部分工作負載的碳量。 例如,當您的應用程式/遊戲更新發生時,您可以逾時;或節流音訊播放的比特率,或其他轉譯精確度層級;或者,如果您有 效率模式,請加以啟用。
電源網格線預測 API 會提供兩個訊號給您 (,以提示時間轉移) 。 一個訊號包含標準化 嚴重性 值, (介於0.0到1.0之間的網格線條件) ,以優化 (碳濃度) 。 另一個訊號 IsLowUserExperienceImpact 是布爾值,代表 Windows 認為使用者離開裝置的時機。 您可以選擇只使用一個訊號,而不是兩者;訊號有個別的值以及一起。
時間轉移 表示使用相同的能源來完成工作,但根據訊號在不同的時間執行。
嚴重性 是介於 0.0 和 1.0 之間的標準化值,其中 0 視為最佳,而 1 是最差的值。 這會根據裝置所在的位置,對應至電源網格線碳嚴重性。
低用戶體驗影響。 布爾值,表示 Windows 認為用戶離開或不使用許多資源時。 這可視為反向使用時數。 當值為 true
時,它會被視為將工作負載時間移轉至的好時機。 當它是 false
時,就用戶體驗而言,它被視為將工作負載逾時到錯誤的時機。
屬性
BlockDuration |
預測向量中每個項目的持續時間。 |
Forecast |
取得包含預測數據的向量。 預測是連續的,從 StartTime 開始。 每個項目的開始時間都可以使用 |
StartTime |
取得 Forecast中第一個專案的開始時間。 |
方法
GetForecast() |
擷取預測的靜態方法。 失敗時,這會傳回空的預測。 |
事件
ForecastUpdated |
當新的預測承載就緒時,通知訂閱者的事件。 預期當您的應用程式收到此通知時,您將會呼叫 GetForecast。 |