当试图调用一个单线程公寓从“错误”的线程(如,Clipboard::SetContent(...)
),我看到以下消息(STA)功能:当我得到WinRT/UWP错误时,如何在C++中调用函数“不支持从MTA激活单线程类?”
激活单线程类从MTA是不支持。
不清楚哪些功能是STA,所以它似乎只是从看似无辜的功能中跳出来。我无法找到解释解决问题的步骤的简单答案。 Windows COM文档很难遵循。
如何可靠地识别什么是STA功能以防止此错误?是不是有一个简单的修复?
当试图调用一个单线程公寓从“错误”的线程(如,Clipboard::SetContent(...)
),我看到以下消息(STA)功能:当我得到WinRT/UWP错误时,如何在C++中调用函数“不支持从MTA激活单线程类?”
激活单线程类从MTA是不支持。
不清楚哪些功能是STA,所以它似乎只是从看似无辜的功能中跳出来。我无法找到解释解决问题的步骤的简单答案。 Windows COM文档很难遵循。
如何可靠地识别什么是STA功能以防止此错误?是不是有一个简单的修复?
问题是您当前正在运行的线程是MTA(多线程单元),并且不支持STA调用。
修复方法是从主/ UI线程调度呼叫,该线程总是STA,因此支持STA呼叫。
首先,通过MainView->CoreWindow
获得您想要的线程,然后调用该线程的调度程序来调用您想要运行的任何内容。例如:
using namespace Windows::UI::Core;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::ApplicationModel::DataTransfer;
CoreWindow^ window = CoreApplication::MainView->CoreWindow;
window->Dispatcher->RunAsync(CoreDispatcherPriority::Normal,
ref new DispatchedHandler
(
[wstringForClipboard]
{
DataPackage^ clipboardInfo = ref new DataPackage;
clipboardInfo->SetText(ref new Platform::String(wstringForClipboard.c_str()));
Clipboard::SetContent(clipboardInfo);
}
)
);
如果您已解决了您的问题,请将其标记为稍后访问此主题的方便的人员接受,谢谢理解。 –
Quote:“这个类不是敏捷的,这意味着你需要考虑它的线程模型和编组行为,更多信息请参见...”。也许它听起来很糟糕,但过了一段时间,你会看到文档和异常之间的联系。通过“看见”说明中的链接,告诉你该怎么做。 –
是的,我仔细研究了下面的答案。增加这个问题的意思是让其他人在踏上STA/MTA地雷时留下那些创伤。 –