门户网站建设情况说明,wordpress 商用,织梦cms如何搭建网站,专题网站开发工具有哪些跨 ABI 的简单信号
如果无需连同事件传递任何形参或实参#xff0c;则可以定义自己的简单 Windows 运行时委托类型。 以下示例展示 Thermometer 运行时类的更简易版本。 它声明名为 SignalDelegate 的委托类型#xff0c;然后使用该类型来引发信号类型事件#xff0c;而不是…跨 ABI 的简单信号
如果无需连同事件传递任何形参或实参则可以定义自己的简单 Windows 运行时委托类型。 以下示例展示 Thermometer 运行时类的更简易版本。 它声明名为 SignalDelegate 的委托类型然后使用该类型来引发信号类型事件而不是具有参数的事件。
// ThermometerWRC.idl
namespace ThermometerWRC
{delegate void SignalDelegate();runtimeclass Thermometer{Thermometer();event ThermometerWRC.SignalDelegate SignalTemperatureIsBelowFreezing;void AdjustTemperature(Single value);};
}// Thermometer.h
...
namespace winrt::ThermometerWRC::implementation
{struct Thermometer : ThermometerTThermometer{...winrt::event_token SignalTemperatureIsBelowFreezing(ThermometerWRC::SignalDelegate const handler);void SignalTemperatureIsBelowFreezing(winrt::event_token const token);void AdjustTemperature(float deltaFahrenheit);private:winrt::eventThermometerWRC::SignalDelegate m_signal;float m_temperatureFahrenheit{ 0.f };};
}// Thermometer.cpp
...
namespace winrt::ThermometerWRC::implementation
{winrt::event_token Thermometer::SignalTemperatureIsBelowFreezing(ThermometerWRC::SignalDelegate const handler){return m_signal.add(handler);}void Thermometer::SignalTemperatureIsBelowFreezing(winrt::event_token const token){m_signal.remove(token);}void Thermometer::AdjustTemperature(float deltaFahrenheit){m_temperatureFahrenheit deltaFahrenheit;if (m_temperatureFahrenheit 32.f){m_signal();}}
}// App.cpp
struct App : implementsApp, IFrameworkViewSource, IFrameworkView
{ThermometerWRC::Thermometer m_thermometer;winrt::event_token m_eventToken;...void Initialize(CoreApplicationView const ){m_eventToken m_thermometer.SignalTemperatureIsBelowFreezing([] { /* ... */ });}...void Uninitialize(){m_thermometer.SignalTemperatureIsBelowFreezing(m_eventToken);}...void OnPointerPressed(IInspectable const , PointerEventArgs const args){m_thermometer.AdjustTemperature(-1.f);...}...
};
项目中的参数化委托、简单信号和回调
如果所需事件是 Visual Studio 项目内部的未跨二进制文件而在内部这些事件不限于 Windows 运行时类型则仍可使用 winrt::eventDelegate 类模板。 请直接使用 winrt::delegate 而不是实际的 Windows 运行时委托类型因为 winrt::delegate 也支持非 Windows 运行时参数。
以下示例先显示不采用任何参数的委托签名本质上即简单信号然后显示采用字符串的委托签名。
如果所需事件是 Visual Studio 项目内部的未跨二进制文件而在内部这些事件不限于 Windows 运行时类型则仍可使用 winrt::eventDelegate 类模板。 请直接使用 winrt::delegate 而不是实际的 Windows 运行时委托类型因为 winrt::delegate 也支持非 Windows 运行时参数。
以下示例先显示不采用任何参数的委托签名本质上即简单信号然后显示采用字符串的委托签名。
winrt::eventwinrt::delegate signal;
signal.add([] { std::wcout LHello, ; });
signal.add([] { std::wcout LWorld! std::endl; });
signal();winrt::eventwinrt::delegatestd::wstring log;
log.add([](std::wstring const message) { std::wcout message.c_str() std::endl; });
log.add([](std::wstring const message) { Persist(message); });
log(LHello, World!);
注意如何向事件添加尽可能多的订阅委托。 但会产生一些与事件相关的开销。 如果只需仅具有一个订阅委托的简单回调则你可以独立使用 winrt::delegate…T。
winrt::delegate signalCallback;
signalCallback [] { std::wcout LHello, World! std::endl; };
signalCallback();winrt::delegatestd::wstring logCallback;
logCallback [](std::wstring const message) { std::wcout message.c_str() std::endl; }f;
logCallback(LHello, World!); 可延迟事件
Windows 运行时中的常见模式是可延迟事件。 事件处理程序通过调用事件参数的 GetDeferral 方法采用延迟。 这样做会向事件源指示应推迟事件后活动直到延迟完成。 这允许事件处理程序执行异步操作以响应事件。
winrt::deferrable_event_args 结构模板是一个帮助程序类用于实现生成Windows 运行时延迟模式。 下面是一个示例。
// Widget.idl
namespace Sample
{runtimeclass WidgetStartingEventArgs{Windows.Foundation.Deferral GetDeferral();Boolean Cancel;};runtimeclass Widget{event Windows.Foundation.TypedEventHandlerWidget, WidgetStartingEventArgs Starting;};
}// Widget.h
namespace winrt::Sample::implementation
{struct Widget : WidgetTWidget{Widget() default;event_token Starting(Windows::Foundation::TypedEventHandlerSample::Widget, Sample::WidgetStartingEventArgs const handler){return m_starting.add(handler);}void Starting(event_token const token) noexcept{m_starting.remove(token);}private:eventWindows::Foundation::TypedEventHandlerSample::Widget, Sample::WidgetStartingEventArgs m_starting;};struct WidgetStartingEventArgs : WidgetStartingEventArgsTWidgetStartingEventArgs,deferrable_event_argsWidgetStartingEventArgs// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^{bool Cancel() const noexcept { return m_cancel; }void Cancel(bool value) noexcept { m_cancel value; }bool m_cancel false;};
}
下面是事件接收方使用可延迟事件模式的方式。
// EventRecipient.h
widget.Starting([](auto sender, auto args) - fire_and_forget
{auto deferral args.GetDeferral();if (!co_await CanWidgetStartAsync(sender)){// Do not allow the widget to start.args.Cancel(true);}deferral.Complete();
}); 作为事件源的实现者生成者从 winrt::deferrable_event_args 派生事件 args 类。 deferrable_event_argsT 为你实现 T::GetDeferral。 它还公开新的帮助程序方法 deferrable_event_args::wait_for_deferrals该方法在所有未完成的延迟完成后完成如果没有延迟要执行则会立即完成。
// Widget.h
IAsyncOperationbool TryStartWidget(Widget const widget)
{auto args make_selfWidgetStartingEventArgs();// Raise the event to let people know that the widget is starting// and give them a chance to prevent it.m_starting(widget, *args);// Wait for deferrals to complete.co_await args-wait_for_deferrals();// Use the results.bool started false;if (!args-Cancel()){widget.InsertBattery();widget.FlipPowerSwitch();started true;}co_return started;
}