线程返回坏空间地址

时间:2012-03-06 20:14:58

标签: multithreading visual-c++ firebreath

我有一个关于在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 个答案:

答案 0 :(得分:0)

你需要在Plugin类的shutdown()函数中停止并加入线程;这将在实际卸载之前被调用,这将有助于避免问题。

我还建议使用boost :: thread,因为FireBreath已经全部编译,这将有助于简化其中的一部分;您可以在线程中将weak_ptr保存到插件类,而不是传入void *。当然,无论哪种方式,你都需要在插件关闭期间停止并加入线程(并且线程需要快速停止 或者浏览器会因此花费很长时间而感到头晕目眩。)