我有一个关于使用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