2009-02-16 1 views
2

Я создал объект XPCOM в C++ для расширения FireFox. Я использую рабочий поток для прослушивания события, и когда это происходит, мне нужно делать материал в основном потоке. Очевидно, я не могу просто сидеть и ждать в JavaScript в основном потоке, потому что вам нужно иметь возможность использовать браузер (мое событие случается очень редко). Я пробовал делать это в потоке (парень xpcom отправляет javascript событие): window.setTimeout (myImportantWorkFunction, 100);Как мне взаимодействовать между потоками в JavaScript?

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

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

ответ

0

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

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

+0

Я понял, что я действительно отвечал на совершенно другой вопрос в своем первоначальном ответе (после удаления), затем я начал писать новый ответ, а затем понял, что просто написал то, что вы сказали, но по-другому: D Go me ! – olliej

+0

Предупреждение не произойдет; Я могу ждать, пока мне нравится (я ждал 20+ минут), и предупреждение не показывалось, пока через несколько секунд после того, как я щелкнул в окне. Тема была создана в расширении (pthread), и она пытается использовать обратный вызов. Если я работаю в обратном вызове, сбой. Поэтому я устанавливаю setTimeout. – Paul

0

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

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

Смежные вопросы