сбой прерывания с плавающей запятой MFC Windows 10

У нас есть продукт MFC, встроенный в Visual Studio 2012/13 на C ++, который выполняет много математических вычислений. Мы используем прерывания с плавающей запятой через сопроцессор, чтобы ускорить вычисления, устанавливая блоки try / catch. Эти прерывания хорошо работают в Windows 7, но одно из обновлений для Windows 10 нарушило последовательность. В то время как вызов «signal» все еще устанавливает правильный указатель для обратного вызова «handler», Windows 10 игнорирует его. (Тот же код работает в консольной программе; он терпит неудачу только в коде MFC, даже в простейшем разобранном примере). У нас есть обходной путь с использованием SEH, но мы все равно хотели бы знать, почему это произошло. Спасибо за любую информацию.

Соответствующий код, где обработчик выдает исключение FloatException (обратите внимание, что прерывание никогда не попадает в обработчик в Windows 10):

   _clearfp();
_controlfp_s(0,  _EM_INEXACT, _MCW_EM);
signal(SIGFPE, (fptr)HandleMathError);
try
{
...calculate
}
catch (FloatException &e)
{
...recover
_fpreset();
_clearfp();
_controlfp_s(0, old_control_word, _MCW_EM);
signal(SIGFPE, SIG_DFL);
return;
}

Для полноты, чтобы увидеть сбой MFC, требуемый код содержит не менее 9 файлов или около того. Сначала создайте простое приложение MFC, используя: один документ, документ / представление, стандартный интерфейс MFC, статическую библиотеку, без составного документа, без базы данных, классическое меню. Затем в MainFrm :: OnCreate вставьте приведенный выше код прерывания с «поднятием (SIGFPE)» в качестве единственного вычисления. Добавьте определение для «HandleMathError» и «Float Exception» как:

typedef void( *fptr )( int );

void __cdecl HandleMathError( int sig, int subcode );

class FloatException : public std::exception
{
public:
FloatException( int _foo )
{
foo = _foo;
}
int foo;
};

void __cdecl HandleMathError( int sig, int subcode )
{
throw FloatException( subcode );
return;
}

С помощью этого кода обработчик прерываний вводится в Windows 7 и не вводится в Windows 10. Проверка наличия обработчика с использованием сигнала положительна в обеих ОС; Windows 10 игнорирует обработчик.

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]