2012-03-06 88 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 *。当然,无论哪种方式,你需要在插件关闭期间停止并加入线程(并且线程需要快速停止,否则浏览器会花费这么长时间来烦恼它)。