我有一个关于在Firebreath插件中使用线程的奇怪问题(在这种情况下是FB插件,但可能在任何地方发生);我会试着解释一下:
我已经描述了我的场景,现在针对这个问题,当添加插件时它会启动一个线程;在线程内部有一个指向“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 :(得分:0)
你需要在Plugin类的shutdown()函数中停止并加入线程;这将在实际卸载之前被调用,这将有助于避免问题。
我还建议使用boost :: thread,因为FireBreath已经全部编译,这将有助于简化其中的一部分;您可以在线程中将weak_ptr保存到插件类,而不是传入void *。当然,无论哪种方式,你都需要在插件关闭期间停止并加入线程(并且线程需要快速停止 或者浏览器会因此花费很长时间而感到头晕目眩。)