1

使用多線程的WinRT分量I有一個使用用C++編寫/ CX的WinRT成分的WinJS應用程序。組件產生一個後臺線程,該線程封裝了一個巨大的遺留線程不安全C++庫的工作,這需要所有調用都來自同一個線程。從WinJS

我需要實現一個生產者/消費者模式,其中在組件的後臺線程是一個製片人,並在JavaScript應用程序UI線程是消費者。

呼叫部分是容易的,如JavaScript可以調用組件的方法(在UI線程),和C++代碼將張貼作業成用於後臺線程的隊列。

的問題是回調:我需要發佈由C++後臺線程計算到UI線程的數據。我當然可以將IAsyncOperation返回給JavaScript,但我不希望在此操作正在等待來自後臺線程的事件時阻塞UI線程。

我有什麼選擇?

+1

您需要使用核心調度之前返回到JS線程調用JS回調。我不幸在這裏沒有一個方便的例子來說明問題,或者我會給出這個答案。 – 2013-03-07 01:53:23

回答

0

已解決。查看http://msdn.microsoft.com/en-us/library/windows/apps/hh755833.aspx的部分:「添加引發事件的異步方法」。

的想法是,部件類聲明的事件處理程序(委託),其可以在JavaScript來設置。 C++後臺線程可以在UI線程的上下文中觸發事件,所以JavaScript事件處理程序被稱爲正確的方式。

當然,這很容易被包裹成WinJS.Promise,這樣的JavaScript應用程序代碼不會知道,有分量,事件等

1

如果你用C實現IAsyncOperation ++/CX在JavaScript端,這將暴露出promise。爲了使承諾的執行不阻塞(例如使用 threawds),圍繞創建簡單封裝UI線程可以

  • 無論是執行工作中紡異步和管理回調自己
  • 使用PPL library lamda 表達式。

在使用PPL,您可以使用併發:: create_async到拉姆達轉換成IAsyncOperation一個單獨的線程執行的情況下,如:

#include <thread> 
#include <ppltasks.h> 
IAsyncOperation<int64>^ Class1::GetAnswer() 
{ 
    return create_async([]() -> int64{ 
     std::this_thread::sleep_for(std::chrono::seconds(10)); 
     return 42; 
    }); 
} 

在JavaScript端可以消耗這IAsyncOperation作爲承諾 - 沒有掛上UI線程的實際工作:

var nativeObject = new CPPComponent.Class1(); 
    nativeObject.getAnswer().then(function(value){ 
    // do something with the result 
    }); 
+0

謝謝,但最初的問題是將後臺線程的結果發佈回UI線程。 – 2013-03-20 16:21:59