2009-02-16 53 views
2

我在C++中爲FireFox擴展創建了一個XPCOM對象。我使用工作線程來監聽一個事件,當它發生時,我需要在主線程上做些事情。顯然,我不能坐在主線程的JavaScript上等待,因爲你需要能夠使用瀏覽器(我的事件很少發生)。 我嘗試在線程中執行此操作(xpcom發送javascript事件): window.setTimeout(myImportantWorkFunction,100);如何在JavaScript中的線程之間進行通信?

這可以工作(在主線程上,按照預期),但它會暫停;它不會像預期的那樣在100ms後發生。你必須點擊一下或調整窗口的大小,然後突然調用該函數。就像JavaScript突然醒了一樣。我認爲這是因爲它發生在一個線程中。

有沒有更好的方法讓工作人員請求主線程執行某些操作?

回答

0

JavaScript只有一個線程。函數調用總是阻塞直到它們返回。如果你是從JS通信到瀏覽器(在這種情況下是瀏覽器的擴展),你應該確保你的瀏覽器端代碼立即返回到JS,並記住一個回調,當你的工作完成時調用(這是setTimeout作品)。

我懷疑「點擊」只是一個巧合。活動一結束,您是否嘗試過提醒?

+0

我意識到自己實際上是在回答完一個完全不同的問題(因爲刪除了),然後我開始寫一個新的答案,然後意識到我只是寫了你所說的,但不同的是:D 轉到我! – olliej 2009-02-17 01:55:40

0

對於那些關心的人,我放棄了嘗試在線程間傳遞消息。我找到了一種使用Objective-C++編譯XPCOM對象的方法,這樣我就可以使用他們的NSDistributedNotificationCenter。這讓我可以在JavaScript開心的主線程中獲得我的事件。

的問題仍然是有效的,但我可能不會採取驗證,現在任何人的答案的時候......