2012-03-06 5 views
1

У меня есть странная проблема с использованием потоков внутри плагина 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 
} 
+0

Где код, который заканчивает резьбу? Должно быть какое-то место, где вы 1. Запросите конец потока. 2. дождитесь окончания. 3. выгрузите плагин. – nos

+0

Добавлен '_endthreadex (0);' в функцию 'Thread'. Благодарю. –

+0

Да, вот как это делается. Что касается шагов, которые вы упомянули; 1) можно ли запросить поток для завершения снаружи процесса нити? 2) Если я дождусь его окончания, у меня будет отсрочка; не так ли? 3) Процесс разгрузки запускается браузером –

ответ

0

Вы должны остановиться и присоединиться к нити в функция shutdown() вашего класса Plugin; который будет вызван до того, как все будет фактически выгружено, и это поможет избежать проблемы.

Я бы также рекомендовал использовать boost :: thread, так как FireBreath уже скомпилирует все это, и это поможет упростить некоторые из них; вы можете удерживать weak_ptr в своем потоке в классе плагинов, а не передавать в void *. Конечно, в любом случае вам нужно будет остановиться и присоединиться к потоку во время выключения плагина (и потоку необходимо быстро остановить , или браузер будет расстраиваться по этому поводу так долго).

Смежные вопросы