2015-06-26 105 views
2

期間更新UI我有一個小的鏢腳本,我打算以下列方式使用:飛鏢:長計算

CanvasElement canvas; 
void main() { 
    canvas = querySelector('#canvas'); 
    querySelector('#start-button').onClick.listen((_) => work()); 
} 

void work() { 
    var state; // some state of the computation 
    for (int i = 0; i < /*big number*/; i++) { 
    // do some long computation 
    render(state); // display intermediate result visualisation on canvas 
    } 
} 

void render(var state) { 
    canvas.context2D.... // draw on canvas based on state 
} 

是監聽點擊一個按鈕,上單擊執行一些長時間的計算和從計算中隨着計算的進行,在畫布上顯示一些中間結果。

但是,這不起作用 - 畫布在整個計算完成後只更新一次。

這是爲什麼?我應該如何安排我的代碼以實時,快速的方式工作?

回答

1

其中一個解決方案是將部分長計算放入飛鏢的event loop,即通過等待計算等待它立即返回的未來。請參閱sample on DartPad。但是如果你有很多繁重的計算,我認爲最好是啓動一個新的隔離體並與它進行有關它的狀態的溝通。

更新

這裏幾乎是不完全一樣,工作的功能,在不使用的await改寫,也許這將是一個更清楚一點它是如何工作的:

for (int i = 0; i < 200; i++) { 
    new Future(()=>compute(i)).then((double result)=>render(i+result*50)); 
} 

在這裏,我們有實際創建200期貨,將它們排入事件循環(Future構造函數做到這一點),併爲每一個回調註冊個人回調。

+0

請問您是否可以用一個小例子來解釋事件循環中的計算概念?關於分離菌,據我瞭解[this](https://www.dartlang.org/articles/event-loop/#use-isolates-or-workers-if-necessary),這是不可能在一個網絡應用程序是我的情況。 – zegkljan

+0

你必須記住,所有的事情都在鏢中的一個單獨的線程中,如果你沒有機會讓Dart的事件循環繼續進行,這是你的問題的情況,它只是積累了所有請求,但是隻有在你的整個計算完成了。 – Mike

+0

在我們將部分計算作爲主循環中的一個單獨事件(在未來執行它)之後,我們開始等待(等待),直到dart計算所有累積的事件,包括html重繪等等。 – Mike