Доброго времен суток. Вопрос следующий (может показаться тривиальным, но опыта в многопоточном программировании имею крайне мало, так что не обессудьте) :
Запускается вторичный поток, в котором происходит некоторое действие (либо анализ, либо обработка), которое в свою очередь  реализовано в отдельном классе. 
Далее, для наглядности, код метода run класса вторичного потока.
void	ModeThread::run()
{
	_mutex.lock();
	State state = _state;
	_mutex.unlock();
	while (state != STOPPED)
	{
		_mutex.lock();
		state = _state;
		_mutex.unlock();
		if (state == ANALYSIS)
		{
			UIProgressObserverObject->progress(_state, _inputFile->fileName()); //уведомление графики
			Analyzer::start(_inputFile, UIResultObserverObject, _stm_type, UIProgressObserverObject);
			_mutex.lock();
			_state = WAITING;
			_mutex.unlock();
			UIProgressObserverObject->progress(_state, _inputFile->fileName());  //уведомление графики
		}
		else if (state == HANDLE)
		{	
			Handler::start();
			_mutex.lock();
			_state = WAITING;
			_mutex.unlock();
		}
		else if (state == WAITING)
		{
			_mutex.lock();
			state = _state;
			_waitCondition.wait(&_mutex);
			_mutex.unlock();
		}
	}
}
Нужно прервать работу этого потока по желанию пользователя (он тыркает некоторую кнопку - поток завершается). Реализовал еще один обзервер для этих целей, всё хорошо. Но не учел тот факт что у меня состояние не изменится пока данный момент не выполниться:
Analyzer::start(_inputFile, UIResultObserverObject, _stm_type, UIProgressObserverObject);
или этот:
 Можно конечно, по тырканью кнопки сделать потоку терминейт, но сами понимаете, это не выход. Собственно, есть ли какой вариант, помимо вставления непосредственно кода анализа (обработки) в вышеуказанны места в коде.
Заранее спасибо.