Я создал абстрактный базовый класс для многократной реализации задачи, которая может вызываться в общем случае через диалог 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. Код выше просто псевдокод того, что у меня есть. Мой фактический код компилируется и запускается, я просто не могу заставить его прерывать.