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 更新用于在更新发生时进行计时,以减少碳排放量。 此 API 会向你公开这些相同的预测,以便减少某些工作负载的碳排放量。 例如,当应用/游戏更新发生时,你可以进行时移;或限制音频播放的比特率,或某些其他渲染保真度级别;或者启用 效率模式(如果有)。
电网预测 API 提供两个信号, (提示时移) 。 一个信号包含规范化 严重性 值 (介于 0.0 到 1.0) 之间的网格条件,以优化 (碳强度) 。 另一个信号 IsLowUserExperienceImpact 是一个布尔值,表示 Windows 认为用户离开设备时。 可以选择只使用一个信号而不是两个信号;信号具有单独的值以及一起的值。
移时 是指使用相同的能量来完成工作,但根据信号在不同的时间完成工作。
严重性 是介于 0.0 和 1.0 之间的规范化值,其中 0 被视为最佳值,1 表示最差。 这对应于基于设备所在位置的电网碳严重性。
用户体验影响较低。 一个布尔值,表示 Windows 认为用户将离开或不使用许多资源。 这可以视为反活动小时数。 当值为 true
时,它被认为是将工作负载及时转移到的合适时机。 false
如果是 ,则就用户体验而言,它被认为是将工作负载及时转移到 的糟糕时机。
属性
BlockDuration |
Forecast 向量中每个元素的持续时间。 |
Forecast |
获取包含预测数据的向量。 预测是连续的,从 StartTime 开始。 可以使用 计算 |
StartTime |
获取 Forecast 中第一个元素的开始时间。 |
方法
GetForecast() |
用于检索预测的静态方法。 失败时,这将返回空的预测。 |
事件
ForecastUpdated |
在新的预测有效负载准备就绪时通知订阅者的事件。 当应用收到此通知时,应调用 GetForecast。 |