Доброго времен суток. Вопрос следующий (может показаться тривиальным, но опыта в многопоточном программировании имею крайне мало, так что не обессудьте) :
Запускается вторичный поток, в котором происходит некоторое действие (либо анализ, либо обработка), которое в свою очередь реализовано в отдельном классе.
Далее, для наглядности, код метода 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);
или этот:
Можно конечно, по тырканью кнопки сделать потоку терминейт, но сами понимаете, это не выход. Собственно, есть ли какой вариант, помимо вставления непосредственно кода анализа (обработки) в вышеуказанны места в коде.
Заранее спасибо.