2012-03-06 41 views
1

我有一個關於使用Firebreath插件中的線程的奇怪問題(在這種情況下是FB插件,但可能發生在任何地方);我將嘗試解釋:線程返回到壞空間地址

  • 1)我的插件創建一個線程(靜態),並且每次將它添加到頁面時都會收到一個指向「this」的指針。
  • 2)所以,現在我有一個指向插件的指針,所以我可以調用它的方法。
  • 3)很不錯,但是,假設我有一個按鈕(用HTML編碼),當按下按鈕時將刪除當前插件,放置另一個按鈕並啓動另一個線程。

我已經描述了我的場景,現在的問題,當一個插件被添加它啓動一個線程;在線程內部有一個指向「this」的指針。第一次,它被解僱......當線程執行時,我按下HTML按鈕(所以,當前插件現在被銷燬),並放置一個新的插件。第一個插件的線程結束,現在返回...但它返回到插件的第二個實例。

該插件是一個圖像查看器,第一個插件查找圖片,它被刪除,並放置一個新的;但是第一個插件的圖像放在第二個插件中。我不知道從哪裏開始尋找,顯然指針有一個地址給插件(例如12345),該插件被刪除並再次使用相同的內存地址(12345)實例化。

有沒有辦法避免這種行爲?

這是我的代碼至今:

myPlugin.h

unsigned ThreadId; 
HANDLE hThread; 

myPlugin.cpp

unsigned __stdcall myPlugin::Thread(void *data) 
{ 
     myPlugin* this = (myPlugin*) data; 
     this->getImage("http:\\host.com\\image.jpg"); 
    _endthreadex(0); //EDIT: addedd this missing line to end the thread 
} 
void myPlugin::onPluginReady(std::string imageUrl) 
{ 
    hThread = (HANDLE)_beginthreadex(NULL, 0, myPlugin::Thread, (void*) **this**, 0, &ThreadId); 
} 
void myPlugin::getImage() 
{ 
    //get an image using CURL... //no problem here 
} 
+0

終止線程的代碼在哪裏?應該有一些地方你1.請求線程結束。 2.等待它結束。 3.卸載插件。 – nos 2012-03-06 20:24:17

+0

在'Thread'函數中增加了'_endthreadex(0);'。謝謝。 – 2012-03-06 20:30:31

+0

是的,就是這樣做的。關於你提到的步驟; 1)是否可以請求一個線程從線程進程外部結束? 2)如果我等待它結束,我會延遲;不是嗎? 3)卸載過程由瀏覽器觸發 – 2012-03-06 20:42:28

回答

0

你需要停下來加入線程你的Plugin類的shutdown()函數;這將在實際卸載之前調用,這將有助於避免此問題。

我也推薦使用boost :: thread,因爲FireBreath已經編譯完成了,這將有助於簡化一些;你可以在你的線程中將weak_ptr放到插件類中,而不是傳入void *。當然,無論哪種方式,你需要在插件關閉期間停止並加入線程(並且線程需要快速停止,否則瀏覽器會花費這麼長時間來煩惱它)。