私は問題を抱えているelectron/node.jsアプリケーションを持っています。具体的には、DOM内の要素を更新することで、同期スポーンの長いループの進行状況をユーザーにフィードバックする必要があります。ただし、実際に表示される内容はループ中に変更されません。ループ全体が完了すると、要素は最後のmax
インデックス値で更新されます。DOM再描画がchildProcess.spawnSyncによってブロックされています
function dosomething(index,callback) {
childProcess.spawnSync('app1',... //takes 1 second
childProcess.spawnSync('app2',... //takes 6 seconds, depends on app1 running 1st
console.log('working on: ' + index);
callback(index);
}
function dosomethingelse(index) {
$('#somediv').html(index); //update progress bar
console.log('displaying: ' + $('#somediv').html());
}
for(var i=0; i<max; i++){ //max is usually 10-100, loop takes 1 to 10 minutes
dosomething(i,dosomethingelse);
}
私はコンソールに進捗HTMLをダンプするとき、それはコールバックとしてインデックスの増分を行います。
CONSOLE:
working on: 0
displaying: 0
working on: 1
displaying: 1
working on: 2
displaying: 2
...
はまた、私はnoに次のコードを実行することにより、再描画のdivを強制しようとしていますavail:
function dosomethingelse(index) {
$('#somediv').html(index); //update progress bar
console.log($('#somediv').html());
//REDRAW
document.getElementById("somediv").innerHTML =num;
document.getElementById("somediv").style.display = 'none';
document.getElementById("somediv").offsetHeight;
document.getElementById("somediv").style.display = 'block';
}
私が読んだところから、spawnSyncを使用すると、バイナリアプリはnodejsでブロックモードで実行されます。これはノードのノンブロッキングコアに直接関係しますが、コマンドラインコールが6秒間実行され、ほぼ100%のCPUがかかるため、私の状況では絶対に必要です。代わりに標準の非同期のスポーンを使用すると、同時に50x100%のプロセスを実行し、同じ時間に数分後に終了します。この場合も、ユーザーに進捗のフィードバックは提供されません。コールバックが完了していない理由を理解できません。私がdosomethingelse
が最初にdosomething
コールバックで呼び出されるように関数を切り替えると、私はまだDOM更新を取得しません。私が試してみました
他の二つの事柄:npm sleep:
dosomething(i);
var sleep = require('sleep');
sleep.usleep(100);
dosomethingelse(i);
そしてdeasync:
var deasync = require('deasync');
deasync(dosomething(i));
dosomethingelse(i);
同じ結果。また、長時間実行しているdosomething
機能を取り出してsleep.sleep(3)
と置き換えると、同じ結果が得られます。ノードは、UIを更新せずに、ただ1つのブロックタスクから次のブロックタスクに移動しています。
私はこのようなコマンドラインタスクスプーラを使用することを考えました:http://vicerveza.homeunix.net/~viric/soft/ts/、それを介してすべての私の重いCPUタスクを実行し、毎秒ポーリング進行状況バーを更新します。このアプローチの問題点は、少なくともこのプラットフォームではクロスプラットフォームではないことです。私は、Windowsのポートでより創造的になる必要があります。 – UltrasoundJelly
プロキシキューに非同期とput'emを実行するだけですか? – mash
電子アプリの一部としてユーザーが見るクロムDOMを更新しようとしています。 – UltrasoundJelly