Приветствую всех!
У меня есть класс (скажем, «Switcher»), который выполняет очень-очень долгую операцию и уведомляет своего слушателя, что операция завершена. Операция длинная, и я выделяю фактическое переключение в отдельный поток:
class Switcher
{
public:
// this is what other users call:
void StartSwitching()
{
// another switch is initiated, I must terminate previous switching operation:
if ( m_Thread != NULL )
{
if ( WaitForThread(m_Thread, 3000) != OK )
{
TerminateThread(m_Thread);
}
}
// start new switching thread:
m_Thread = StartNewThread( ThreadProc );
}
// this is a thread procedure:
static void ThreadProc()
{
DoActualSwitching();
NotifyListener();
}
private:
Thread m_Thread;
};
Логика довольно проста - если пользователь инициирует новое переключение до завершения предыдущего, я прекращаю предыдущее переключение (не обращая внимания на то, что происходит внутри "DoActualSwitching ()") и запускаю новое. Проблема в том, что иногда при завершении потока я теряю вызов NotifyListener ().
Я хотел бы внести некоторые улучшения, чтобы гарантировать, что NotifyListener () вызывается каждый раз, даже если поток завершается. Есть ли шаблон для этого? Я могу думать только о другом потоке, который бесконечно ждет коммутатора и, если коммутатор выполнен (правильно или по завершении), он может выдать уведомление. Но знакомство с другой темой для меня кажется излишним. Можете ли вы придумать какое-либо другое решение (например, платформа win32)?
Спасибо!