Как я могу общаться между потоками в JavaScript? - PullRequest
2 голосов
/ 17 февраля 2009

Я создал объект XPCOM в C ++ для расширения FireFox. Я использую рабочий поток для прослушивания события, и когда это происходит, мне нужно что-то делать в основном потоке. Очевидно, что я не могу просто сидеть и ждать в JavaScript в основном потоке, потому что вам нужно иметь возможность использовать браузер (мое событие происходит очень редко).

Я пытался сделать это в потоке (парень xpcom отправляет javascript событие):

window.setTimeout( myImportantWorkFunction, 100 );

Это работает (в главном потоке, как и предполагалось), но будет приостановлено на неопределенный срок. это не произойдет после 100 мс, как задумано. Вы должны немного щелкнуть или изменить размер окна, а затем внезапно вызывается функция. Как будто JavaScript внезапно проснулся. Я предполагаю, что это потому, что это происходит в потоке.

Есть ли какой-нибудь лучший способ для работника попросить главный поток что-то сделать?

Ответы [ 3 ]

0 голосов
/ 18 февраля 2009

Для тех, кого это волнует, я перестал пытаться переписываться между потоками. Я нашел способ скомпилировать объект XPCOM с некоторыми целью C ++, чтобы я мог использовать их NSDistributedNotificationCenter. Это позволяет мне получить мое событие в главном потоке, где javascript счастлив.

Вопрос все еще актуален, но я, вероятно, сейчас не найду время, чтобы подтвердить чей-либо ответ ...

0 голосов
/ 29 октября 2009
0 голосов
/ 17 февраля 2009

JavaScript имеет только одну нить. Вызовы функций всегда блокируются, пока они не вернутся. Если вы общаетесь из JS с браузером (или с расширением браузера в этом случае), вы должны убедиться, что ваш код на стороне браузера немедленно возвращается в JS, и помните обратный вызов для вызова, когда ваша работа завершается (именно так setTimeout работы).

Я подозреваю, что "щелчок вокруг" - просто совпадение. Вы пробовали оповещать, как только происходит событие?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...