>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Синхронизация потоков http://forum.mozilla-russia.org/viewtopic.php?id=44760 |
LedVisel > 06-06-2010 22:01:47 |
Требуется пустить в бекграунде новый поток. Сделал как описано здесь: https://developer.mozilla.org/en/Code_snippets/Threads |
Anton > 06-06-2010 23:49:43 |
Вот, например: Выделить код Код:var b = document. getElementById ("custombuttons-button17"); var proxyObjectManager = Components.classes["@mozilla.org/xpcomproxy;1"] .getService(Components.interfaces.nsIProxyObjectManager); var proxyType = proxyObjectManager.INVOKE_ASYNC | proxyObjectManager.FORCE_PROXY_CREATION; var thread = Components.classes["@mozilla.org/thread-manager;1"] .getService(Components.interfaces.nsIThreadManager) .newThread(0); var po = proxyObjectManager.getProxyForObject (null, Components.interfaces.nsIDOMElement, b, proxyType); // po = b; // crash test var fun = (function (elt) { return function (s) { elt. setAttribute ("label", s); }; }) (po); var backgroundTask = { run: function() { var i, j, s = "a"; for (i = 0; i < 3; i++) { fun (s); for (j = 0; j < 10000000; j++) { j = (j + 1) - 1; } s += "a"; } } } thread.dispatch(backgroundTask, thread.DISPATCH_NORMAL); |
LedVisel > 07-06-2010 00:53:46 |
спасибо, именно такой пример нужен был! |
LedVisel > 07-06-2010 03:20:57 |
эмм.. работает, но немного не так как я ожидал. подскажите, а это вообще реально, чтобы из дочернего потока можно было выполнить такие команды как например alert("blabla") или gBrowser.contentWindow.location = "http://google.com" ? |
Anton > 07-06-2010 20:41:12 |
LedVisel пишет
По моим наблюдениям - зависает не всегда. Еще можно попробовать выполнять нужные действия из основного потока, передавая дочернему потоку объект основного, что-то вроде: Выделить код Код:var proxyObjectManager = Components.classes["@mozilla.org/xpcomproxy;1"] .getService(Components.interfaces.nsIProxyObjectManager); var proxyType = proxyObjectManager.INVOKE_SYNC | proxyObjectManager.FORCE_PROXY_CREATION; var thread = Components.classes["@mozilla.org/thread-manager;1"] .getService(Components.interfaces.nsIThreadManager) .newThread(0); var mto = { QueryInterface: function (iid) { return this; }, observe: function (s, t, d) { gBrowser. contentWindow. location. href = d; } }; var po = proxyObjectManager.getProxyForObject (null, Components.interfaces.nsIObserver, mto, proxyType); var fun = (function (elt) { return function (s) { elt. observe (null, "", s); }; }) (po); var backgroundTask = { run: function() { var i, j, s = "a"; for (i = 0; i < 3; i++) { fun ("http://www.google.com"); for (j = 0; j < 10000000; j++) { j = (j + 1) - 1; } s += "a"; } } } thread.dispatch(backgroundTask, thread.DISPATCH_NORMAL); |
LedVisel > 07-06-2010 22:23:10 |
спасибо за этот вариант, держите в репу. я пытался сам сделать нечто похожее, но что-то не получалось, уже не помню что. |
Anton > 11-06-2010 18:05:32 |
LedVisel пишет
Возможно. Например, backgroundTask реализует интерфейс nsIObserver и, получая глобальное уведомление изменяет внутренний флаг, который периодически проверяется кодом из run () |