Привет.
Сюжет. Работает поток 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