Exception в другом потоке
От: Chez Россия  
Дата: 03.06.05 07:30
Оценка: +1
Привет.

Сюжет. Работает поток A, исполняющий большой объём кода (рассчёт чего-либо). На любом этапе нужно обновлять пользовательский интерфейс — сообщать о текущем состоянии процесса, обрабатывать Cancel.
Из-за этого в очень многих местах приходится вставлять код вроде
m_pUICtx->UpdateStatus(currentStage, currentPercent, ...);
if (m_pUICtx->IsCancelled())
{
   cleanup();
     return ...;
}

Предложение.
Это плохо. Мне пришла в голову хорошая идея.
Если можно было бы из внешнего UI-потока B вытолкнуть исключение, которое отработаыло бы в контексте потока A, то можно было бы такие вещи творить!
Весь код потока A можно было бы очистить от кода связанного с UI.
При возникновении исключения на любом этапе наступает Cancel. Если нужно, поток A может перехватить это исключение чтобы сделать нужные подчистки.

Для обновления состояния UI можно было бы использовать SEH исключения:

поток A

int report_progress(int i)
{
    pUICtx->Update(i);
    return EXCEPTION_CONTINUE_EXECUTION;
}

void A_worker()
{
    int i = 0;

    __try
    {
        i++;
        // здесь внешний код вызывает UpdateUI_Exception
        i++;
        i++;
        ...
    }
    __except(report_progress(i))
    {
    }
}


Идея мне очень понравилась. На её основе можно было бы решить множество красивых задач — обработка UI это самая очевидня среди них.

Собственно, вопрос: можно ли как-то вытолкнуть исключение (C++ и\или SEH) в другом потоке?

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.