0

平均的な Google デスクトップ ガジェットを考えてみましょう。次のコードを追加します。

 debug.trace("go!");
 for (var i = 0; i < 100000000; i++) { // google desktop stops responding
      j = 12 * i;
 }
 debug.trace("finished");

コードが実行されているガジェットを含め、すべての Google デスクトップ ガジェットがロックアップまたはフリーズします (通常のダブルシフト ショートカットは機能しません。ガジェットを移動したり、他の方法でガジェットを操作したりすることはできません。システム トレイアイコンは応答しますが、何もしません - たとえば、オプション ページはコードが終了するまでロードされません)。

私はこの一般的な状況を回避する方法を探しています (私の場合は、戻るのに時間がかかる DLL を介して外部関数呼び出しを行っています。gmanifest 'install' 要素を参照してください)。

setInterval / setTimeout を介して呼び出し (/ 上記のコード) をトリガーしても、違いはないようです。また、長い呼び出しが行われている間に、通常はタイマーによって呼び出されるコードが実行されることもありません。

ビジー ループまたはブロックしている外部関数呼び出しの代わりに次のコードを試すと、何もロックアップしないため、これは可能であると想定しています。

 var wsh = new ActiveXObject("WScript.Shell");
 wsh.run("cmd.exe",1,true); // true = block until program has exited
 // UI responds in this period
 debug.trace("finished"); // occurs when cmd.exe is closed

これら3つのケースの違いが何であるかはわかりません。何かアイデアはありますか?

考え:

  • ビジーループ自体はブロックしていませんが、すべてのプロセッサ時間を使い果たしているため、何も起こらないため、代表的ではありません (可能性は低いようです) [編集: いいえ、ブロックしています]

  • DLLまたは私が使用している方法は、それぞれ壊れているか間違っています(必要に応じて詳細を追加できます)[編集:そうではないようです。通常のブロッキング呼び出しです]

  • Googleガジェットはwscript.shellを「認識」し、「実行」がブロックされている間も続行します(可能性は低いようです)[編集:未回答!]

  • ブロッキング コードのワーカー スレッドを明示的に生成できました (ガジェットの明示的なスレッド制御に関するものは見つかりませんでした) [編集: 不可能です。JavaScriptには単一のスレッドがあります]

  • ブロック呼び出しを外部プログラムでまとめ、ファイルをポーリングしてステータスの更新を確認します (回答を参照)

4

1 に答える 1

0

Javascript には、1 つの呼び出しスタックを持つ実行中のスレッドが 1 つだけあります。そのスレッドを保留して、コール スタックを保存し、後で再開することはできません。

応答性を維持する JavaScript の方法は、実行の準備が整ったときにコールバックを取得することです。経験則として、スレッドを独り占めして何かが起こるのを待ってはいけません。

これが、AJAX (非同期) に A がある理由ですXmlHttpRequest

于 2010-11-21T21:37:24.710 に答える