У меня есть странная проблема с использованием потоков внутри плагина Firebreath (в данном случае это плагин FB, но может произойти где угодно); Я попытаюсь объяснить:Ввод, возвращающийся в неправильный адрес пространства
- 1) Мой плагин создает поток (статический), и он получает указатель на «это» каждый раз, когда он добавляется на страницу.
- 2) Итак, теперь у меня есть поток с указателем на плагин, поэтому я могу назвать его методы.
- 3) Очень приятно до сих пор, НО, предположим, что у меня есть кнопка (закодирована в HTML), которая при нажатии будет удалять текущий плагин, вставить еще один и запустить другой поток.
Я описал свой сценарий, теперь для проблемы, когда плагин добавляется, он запускает поток; внутри потока есть указатель на «это». В первый раз он запускается ... пока поток выполняется, я нажимаю кнопку 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
Добавлен '_endthreadex (0);' в функцию 'Thread'. Благодарю. –
Да, вот как это делается. Что касается шагов, которые вы упомянули; 1) можно ли запросить поток для завершения снаружи процесса нити? 2) Если я дождусь его окончания, у меня будет отсрочка; не так ли? 3) Процесс разгрузки запускается браузером –