Wenn ich richtig verstehe, möchten Sie eine asynchrone Operation ausführen können, wenn auf eine Schaltfläche geklickt wird, aber auf einen bestimmten Thread, auf den Sie als Ihr Arbeitsthread verweisen.
Erstens - Da Sie eine Ressource in 2 Threads verwenden möchten, sollten Sie nicht unique_ptr
verwenden und shared_ptr
verwenden, da Sie diese Ressource zwischen den beiden Threads teilen.
Zweitens - wenn Sie die Aktion nicht unbedingt für einen bestimmten Thread ausführen müssen, können Sie einfach Windows::System::Threading::ThreadPool::RunAsync verwenden und den Wert shared_ptr
wertmäßig erfassen.
zB:
namespace WST = Windows::System::Threading;
WST::ThreadPool::RunAsync(
ref new WST::WorkItemHandler(
[mySharedPtr](Windows::Foundation::IAsyncAction^ operation)
{
mySharedPtr->Foo();
}));
Im Fall müssen Sie den Vorgang auf einen bestimmten Thread laufen dann gehe ich davon aus Sie in der Lage sein wollen, Operationen zu einem bereits laufenden Thread anhängen, sonst werden Sie einen Thread erstellen und Sie können das obige Beispiel verwenden. Um also Operationen an einen bereits laufenden Thread anzuhängen, muss dieser Thread die Funktion haben, neue Operationen zu erhalten und diese Operationen dann in einer synchronen Reihenfolge auszuführen. Diese Funktionalität ist im Grunde der Dispatcher. Dies ist, was ein Event Loop ist, auch genannt: Message Dispatcher, Nachrichtenschleife, Nachrichtenpumpe oder Laufschleife. Sie können Informationen auch finden, indem Sie auf dem Recator \ Proactor Entwurfsmuster lesen.
This CodeProject Seite zeigt eine Möglichkeit, das Muster der Umsetzung, und Sie können WinRT Komponente verwenden, um es besser zu machen \ mehr conveniant \ vertrauter
Der UI-Thread ist etwas Besonderes, es einen Dispatcher hat, der die [Erzeuger-Verbraucher löst Problem] (https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem). Mit dieser Option können Sie Code für diesen Thread ausführen. Wenn Sie dies auch in einem Worker-Thread tun möchten, müssen Sie das gleiche Problem lösen. Eine Thread-sichere Warteschlange ist erforderlich. –