2011-12-29 21 views
17

私は、Web Workersを使用して、ユーザーが自分のWebサイトをブラウズしている間に、いくつかのバックグラウンド機能を提供することを考えています。しかし、私は遅いスクロール、応答の遅いコントロールなどを引き起こすことによってユーザーエクスペリエンスを傷つける危険を冒すことはしません.WebワーカーはOSスレッドにマップされています。したがって、これらのスレッドの優先順位については、私が知っているように、現在のAPIにはそのようなものはありません。あなたはこれを達成する方法を知っていますか?ハックでも?Webワーカーを低優先度に設定する方法はありますか?

+2

どのプラットフォームと言語でですか? – rene

+0

ウェブワーカーをどのようなタスクで使用する予定ですか?定期的な活動ですか? 1回のタスクの実行? – Tudor

+0

@ Tudor一度実行するといいでしょう(たとえば、ユーザーが写真をアップロードし、ワーカーがPhotoshopのようなフィルタを適用します。かなりCPUを消費し、ワーカーはメインスレッドに警告します)。 – tunnuz

答えて

11

このような低レベルの詳細を制御するAPI呼び出しはありません。しかし、私はあなたが最初にやりたいことを実装してから、パフォーマンスのヒットがユーザーエクスペリエンスの面で大きすぎるかどうかをテストする必要があると思います。私は、スレッドの実行方法を細かく制御することはできないため、基本的な実装によってうまく管理されていると想定しています。

9

ハックでも? [...] ユーザーが写真をアップロードし、労働者はかなりCPU集中型であることにPhotoshopのような フィルタを適用し、その後、作業員は はここでハックのメインスレッド

警告します。

コードをスローダウンします。

var TIME_STEP = 10, 
    paused = false, 
    state; // set by commands.start() 

function main_loop() { 
    if (paused) { 
     return; 
    } 

    // update state incrementally. Break your process into chunks 
    // for example pixels or rows of pixels 
    state = ____________; 

    // send state or progress to main thread 
    if (finished) { 
     self.postMessage(state); 
    } else { 
     self.postMessage(progress); 
    } 

    setTimeout(main_loop, TIME_STEP); 
} 

var commands = { 
    //...functions that can be called from main thread (pause/start/cancel/etc)... 
}; 

function message_handler (event) { 
    var data = event.data; 
    var command = commands[data.command]; 

    command.apply(this, data.args); 
} 

self.addEventListener('message', message_handler, false); 

TIME_STEPは計算の間の時間であり、あなたは何をしているかによって、どのように長い間、あなたはそれが時間です増加する余裕があるの異なるものにする必要があります。このような何かが、私は現在、粒子シミュレーションのために使用していますものです。このようにすることの良い点の1つは、反復の間に一時停止とキャンセルの要求を受け入れることができることです。

関連する問題