我如何在使用 winrt::static_lifetime 时获取 class 的实例?
How do i get the Instance of the class when i use winrt::static_lifetime?
我不久前从 C++/CX 切换到 C++/winrt,目前我卡住了,因为我想创建一个单例 winrt-class。我阅读了有关 winrt::static_lifetime (https://docs.microsoft.com/en-us/uwp/cpp-ref-for-winrt/static-lifetime) 的信息,但他们没有提供任何有关如何使用它的代码示例。
所以我的问题是如何用这个获得 class 的实例?
提前感谢您的帮助。
winrt::static_lifetime
指定工厂是单例,因此您基本上需要将单例实例实现为(现在是单例)工厂的 属性。
即:
namespace Foo::implementation {
struct Foo : FooT<Foo> {
Foo() {
}
static Foo Singleton() {
auto fooFactory = winrt::make<factory_implementation::Foo>();
return fooFactory->Singleton();
}
};
}
namespace Foo::factory_implementation {
// specifies the factory is a singleton
struct Foo : FooT<Foo, implementation::Foo, winrt::static_lifetime>
{
Foo Singleton() {
slim_lock_guard lock{ m_lock };
if (!m_singleton) {
m_singleton = winrt::make<Foo>();
}
return m_singleton;
}
private:
winrt::slim_mutex m_lock;
Foo m_singleton;
};
}
那么为什么与类似的东西相比,这个更受欢迎:
static Foo Singleton() {
static auto single = winrt::make<Foo>();
return single;
}
之所以这样做是因为在RoUninitialize之后进程静态可能会被破坏导致崩溃。 winrt::static_lifetime 基本上将工厂放入 CoreApplication.Properties
,它在进程执行 RoUninitialize 之前安全未初始化。这基本上与过去需要避免将遗留 COM 对象存储到进程全局变量中的原因相同。
我不久前从 C++/CX 切换到 C++/winrt,目前我卡住了,因为我想创建一个单例 winrt-class。我阅读了有关 winrt::static_lifetime (https://docs.microsoft.com/en-us/uwp/cpp-ref-for-winrt/static-lifetime) 的信息,但他们没有提供任何有关如何使用它的代码示例。 所以我的问题是如何用这个获得 class 的实例?
提前感谢您的帮助。
winrt::static_lifetime
指定工厂是单例,因此您基本上需要将单例实例实现为(现在是单例)工厂的 属性。
即:
namespace Foo::implementation {
struct Foo : FooT<Foo> {
Foo() {
}
static Foo Singleton() {
auto fooFactory = winrt::make<factory_implementation::Foo>();
return fooFactory->Singleton();
}
};
}
namespace Foo::factory_implementation {
// specifies the factory is a singleton
struct Foo : FooT<Foo, implementation::Foo, winrt::static_lifetime>
{
Foo Singleton() {
slim_lock_guard lock{ m_lock };
if (!m_singleton) {
m_singleton = winrt::make<Foo>();
}
return m_singleton;
}
private:
winrt::slim_mutex m_lock;
Foo m_singleton;
};
}
那么为什么与类似的东西相比,这个更受欢迎:
static Foo Singleton() {
static auto single = winrt::make<Foo>();
return single;
}
之所以这样做是因为在RoUninitialize之后进程静态可能会被破坏导致崩溃。 winrt::static_lifetime 基本上将工厂放入 CoreApplication.Properties
,它在进程执行 RoUninitialize 之前安全未初始化。这基本上与过去需要避免将遗留 COM 对象存储到进程全局变量中的原因相同。