Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Vakaların büyük çoğunluğunda, bir Windows Çalışma Zamanı sınıfının örneğine herhangi bir iş parçacığından erişilebilir (tıpkı çoğu standart C++ nesnesinde olduğu gibi). Böyle bir Windows Çalışma Zamanı sınıfı çeviktir. Windows ile birlikte gelen Windows Çalışma Zamanı sınıflarından yalnızca birkaçı agile olmayan sınıflardır, ancak bunları kullandığınızda iş parçacığı modelini ve marshaling davranışını dikkate almanız gerekir (marshaling, verilerin bir apartment sınırı üzerinden aktarılmasıdır). Her Windows Çalışma Zamanı nesnesinin çevik olması iyi bir varsayılandır, bu nedenle kendi C++/WinRT türleriniz varsayılan olarak çeviktir.
Ama bunu devre dışı bırakabilirsiniz. Örneğin, türünüze ait bir nesnenin belirli bir tek iş parçacıklı dairede bulunmasını gerektiren güçlü bir nedeniniz olabilir. Bunun genellikle yeniden giriş gereksinimleriyle ilgili olması gerekir. Ancak kullanıcı arabirimi (UI) API'leri bile giderek daha çevik nesneler sunuyor. Genel olarak çeviklik en basit ve en performanslı seçenektir. Ayrıca, bir etkinleştirme fabrikası uyguladığınızda, karşılık gelen çalışma zamanı sınıfınız çevik olmasa bile bu fabrikanın çevik olması gerekir.
Note
Windows Çalışma Zamanı COM tabanlıdır. COM terimleriyle, çevik bir sınıf ThreadingModel = Both ile kaydedilir. COM iş parçacığı oluşturma modelleri ve apartment'lar hakkında daha fazla bilgi için COM İş Parçacığı Oluşturma Modellerini Anlama ve Kullanma konusuna bakın.
Kod örnekleri
C++/WinRT'nin çevikliği nasıl desteklediğini göstermek için bir çalışma zamanı sınıfının örnek uygulamasını kullanalım.
#include <winrt/Windows.Foundation.h>
using namespace winrt;
using namespace Windows::Foundation;
struct MyType : winrt::implements<MyType, IStringable>
{
winrt::hstring ToString(){ ... }
};
Vazgeçmediğimiz için bu uygulama çeviktir. winrt::implements temel yapısı, IAgileObject ve IMarshal'ı uygular. IMarshal uygulaması, IAgileObject hakkında bilgisiz eski kod için doğru şeyi yapmak için CoCreateFreeThreadedMarshaler kullanır.
Bu kod bir nesneyi çeviklik açısından denetler.
IUnknown::as çağrısı, çevik değilse myimpl bir özel durum oluşturur.
winrt::com_ptr<MyType> myimpl{ winrt::make_self<MyType>() };
winrt::com_ptr<IAgileObject> iagileobject{ myimpl.as<IAgileObject>() };
Bir özel durumu işlemek yerine , bunun yerine IUnknown::try_as çağırabilirsiniz.
winrt::com_ptr<IAgileObject> iagileobject{ myimpl.try_as<IAgileObject>() };
if (iagileobject) { /* myimpl is agile. */ }
IAgileObject'in kendi yöntemi yoktur, bu nedenle onunla fazla bir şey yapamazsınız. Bu sonraki değişken daha tipiktir.
if (myimpl.try_as<IAgileObject>()) { /* myimpl is agile. */ }
IAgileObject bir işaretçi arabirimidir. IAgileObject için yapılan sorgunun yalnızca başarılı olup olmaması, bundan elde edebileceğiniz bilgi ve faydanın tamamıdır.
Çevik nesne desteğini geri çevirme
winrt::non_agile işaretçi yapısını temel sınıfınıza şablon argümanı olarak ileterek çevik nesne desteğini açıkça devre dışı bırakmayı seçebilirsiniz.
winrt::implements sınıfından doğrudan türetiyorsanız.
struct MyImplementation: implements<MyImplementation, IStringable, winrt::non_agile>
{
...
}
Bir çalışma zamanı sınıfı oluşturuyorsanız.
struct MyRuntimeClass: MyRuntimeClassT<MyRuntimeClass, winrt::non_agile>
{
...
}
İşaretçi yapısının variadic parametre paketinde nerede göründüğü önemli değildir.
Çevikliği geri çevirseniz de etmeseniz de , IMarshal'ı kendiniz uygulayabilirsiniz. Örneğin, varsayılan çeviklik uygulamasını önlemek için winrt::non_agile işaretçisini kullanabilir ve IMarshal'ı kendiniz uygulayabilirsiniz; belki de değere göre sıralama semantiğini desteklemek için.
Agile referansları (winrt::agile_ref)
Çevik olmayan bir nesneyi kullanıyor, ancak onu çevik olabilecek bir bağlamda aktarmanız gerekiyorsa, seçeneklerden biri, çevik olmayan bir türün örneğine veya çevik olmayan bir nesnenin bir arabirimine çevik bir referans elde etmek için winrt::agile_ref yapı şablonunu kullanmaktır.
NonAgileType nonagile_obj;
winrt::agile_ref<NonAgileType> agile{ nonagile_obj };
İsterseniz winrt::make_agile yardımcı işlevini kullanabilirsiniz.
NonAgileType nonagile_obj;
auto agile{ winrt::make_agile(nonagile_obj) };
Her iki durumda da, agile artık farklı bir dairedeki bir iş parçacığına serbestçe geçirilebilir ve orada kullanılabilir.
co_await resume_background();
NonAgileType nonagile_obj_again{ agile.get() };
winrt::hstring message{ nonagile_obj_again.Message() };
agile_ref::get çağrısı, get'in çağrıldığı iş parçacığı bağlamında güvenle kullanılabilecek bir ara sunucu döndürür.
Önemli API'ler
- IAgileObject arabirimi
- IMarshal arabirimi
- winrt::agile_ref yapı şablonu
- winrt::implements struct template
- winrt::make_agile işlev şablonu
- winrt::non_agile işaretçi yapısı
- winrt::Windows::Foundation::IUnknown::as fonksiyonu
- winrt::Windows::Foundation::IUnknown::try_as işlevi
İlgili konular
Windows developer