Вызов абстрактной функции в форсированном потоке, не прерывается в точке прерывания - PullRequest
2 голосов
/ 02 сентября 2011

Я создал абстрактный базовый класс для многократной реализации задачи, которая может вызываться в общем случае через диалог MFC. Эта задача должна быть прервана, если пользователь нажимает кнопку «Отмена».

abstract_dll.h:

class abstract_dll
{
public:
    virtual void my_task(CFeedback *fb)=0;
}

Где CFeedback - абстрактный класс для управления обратной связью с пользователем (т. Е. Индикатор выполнения)

concrete_dll.h:

class concrete_dll 
{
    virtual void my_task(CFeedback *fb)
    {
        //do some work
        //step progress bar
        boost::this_thread::interruption_point();

        //do some work
        //step progress bar
        boost::this_thread::interruption_point();
    }
}

extern "C" abstract_dll* get_class() { return new concrete_dll(); }

Теперь в диалоге MFC я загружаю соответствующую concrete_dll и инициализирую мой abstract_dll *dll = module->get_class();

Затем начните новый boost::thread, который вызывает dll->my_task(fb);

Тогда, когда я позвоню thread.interrupt(). Поток никогда не прерывается, и он никогда не исключается в моих точках прерывания. Я проследил, что идентификатор потока не изменился, пока мы не находимся в реализации concrete_dll, тогда я просто получаю 0x0000 для идентификатора потока.

Есть мысли? PS. Код выше просто псевдокод того, что у меня есть. Мой фактический код компилируется и запускается, я просто не могу заставить его прерывать.

1 Ответ

2 голосов
/ 11 сентября 2011

Я думаю, что ответ на ваш вопрос здесь:

http://lists.boost.org/boost-users/2010/01/55171.php

Вкратце: вам нужно указать ссылку на версию DLL boost: потоков как в вашем проекте, так и в DLL.Просто поставьте:

#define BOOST_THREAD_USE_DLL

перед включением <boost/thread.hpp> (или в свойствах проекта)

BR

...