原文:http://hi.baidu.com/xletian/blog/item/f66af7edde2cc35f78f0558e.html

扩展开发最共同的问题之一是如何后台执行长时间操作。如果不小心会在操作完成前挂起应用。 这儿有几个技巧.
用setTimeout来计划任务

后台执行工作最容易和安全的方法是分割成小片段来执行。 For example:
[code=javascript]
function backgroundTask() {
// Perform a small amount of work

window.setTimeout(arguments.callee, 100);
}

window.setTimeout(backgroundTask, 100);
[/code]
这个函数预定每100毫秒执行。 假定函数每次执行很短时间应用会继续响应。 Once the function has completed whatever work it is performing it should just return early rather than reschedule the execution.
在主线程排队任务

不用setTimeout把任务放到主线程的简单方法,是创建一个简单的可运行对象并用 Thread Manager附加。这里有个函数可以用来替代 setTimeout:
[code=javascript]
function executeSoon(aFunc)
{
var tm = Components.classes["@mozilla.org/thread-manager;1"]
.getService(Components.interfaces.nsIThreadManager);

tm.mainThread.dispatch({
run: function()
{
aFunc();
}
}, Ci.nsIThread.DISPATCH_NORMAL);
}
[/code]
因为这个函数跑在主线程,它可能使UI无响应。解除这个限制,你需要一个真正的线程来创建后台任务。
创建一个真正的线程

用真正的线程更容易出错。 尤其是牵涉DOM和许多其它组件时有许多陷阱.可能导致整个应用崩溃或挂起。
[code=javascript]
backgroundTask = {
run: function() {
// 不要牵涉到DOM或其它线程不安全的操作
}
}

var thread = Components.classes["@mozilla.org/thread-manager;1"]
.getService(Components.interfaces.nsIThreadManager)
.newThread(0);
thread.dispatch(backgroundTask, thread.DISPATCH_NORMAL);
[/code]
这里展示了一个简单的对象,其run方法被创建的后台线程调用。线程安全的更多内容见 Thread Manager 文档。
等待一个后台任务完成

[code=javascript]
var thread = Components.classes["@mozilla.org/thread-manager;1"]
.getService(Components.interfaces.nsIThreadManager)
.currentThread;
while (!complete)
thread.processNextEvent(true);
[/code]

转:http://fregen.yo2.cn/articles/thread.html

posted on 2011-11-02 14:17  hotty  阅读(384)  评论(0)    收藏  举报