Поток возвращается в неправильный адрес - PullRequest
1 голос
/ 07 марта 2012

У меня странная проблема, связанная с использованием потоков внутри плагина Firebreath (в данном случае это плагин FB, но может произойти где угодно);Я попытаюсь объяснить:

  • 1) Мой плагин создает поток (статический) и получает указатель на «this» каждый раз, когда его добавляют на страницу.
  • 2) Итак, теперь у меня есть поток с указателем на плагин, так что я могу вызывать его методы.
  • 3) Пока очень хорошо, НО, предположим, что у меня есть кнопка (закодированная в HTML),который при нажатии удалит текущий плагин, поставит на место другой и запустит другой поток.

Я описал свой сценарий, теперь для проблемы, когда плагин добавляется, он запускает поток;внутри потока есть указатель на «это».В первый раз, он запускается ... во время выполнения потока я нажимаю кнопку HTML (поэтому текущий плагин теперь уничтожен) и помещается новый.Поток из 1-го плагина заканчивается, и теперь возвращается ... но он возвращается ко 2-му экземпляру плагина.

Плагин является средством просмотра изображений, первый плагин ищет изображение, он удаляется иновый помещен;НО изображение из 1-го плагина помещается во 2-й.Я не знаю, с чего начать поиск, по-видимому, указатель имеет адрес для плагина (например, 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 голосов
/ 07 марта 2012

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

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

...