我有一個關於使用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
}
終止線程的代碼在哪裏?應該有一些地方你1.請求線程結束。 2.等待它結束。 3.卸載插件。 – nos 2012-03-06 20:24:17
在'Thread'函數中增加了'_endthreadex(0);'。謝謝。 – 2012-03-06 20:30:31
是的,就是這樣做的。關於你提到的步驟; 1)是否可以請求一個線程從線程進程外部結束? 2)如果我等待它結束,我會延遲;不是嗎? 3)卸載過程由瀏覽器觸發 – 2012-03-06 20:42:28