2016-07-30 6 views
0

Ich habe einen laufenden Thread während der gesamten Laufzeit, der Ereignisse generiert.Wie kann ich aus dem UI-Thread auf einen Worker-Thread zugreifen?

Ich kann diese Ereignisse innerhalb des UI-Threads mit disp = Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcher umgehen.

genauer gesagt, ich die Änderungen an der Benutzeroberfläche mit disp->RunAsync(...) irgendwo innerhalb der Arbeits-Thread.

aber ich weiß nicht, wie man den invertierten Betrieb macht. Ich möchte eine Async-Funktion innerhalb des UI-Threads haben, um die Operation (auf einigen std::unique_ptr) im Arbeits-Thread auszuführen, wenn ich auf eine Schaltfläche klicke.

+0

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. –

Antwort

0

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_ptrwertmäß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

+0

eigentlich benutze ich nur einen Arbeits-Thread, löste ich das Problem mit einer Warteschlange Liste von Aufträgen. Bestellungen werden vom UI-Thread gesendet und im Arbeits-Thread ausgeführt. –

Verwandte Themen