шаблон наблюдателя — управляемый событиями дизайн в переполнении стека

В моем приложении, управляемом событиями, у меня есть общая проблема. Предположим, следующая диаграмма классов:

диаграмма классов

Я использую шаблон наблюдателя здесь. Worker а также WorkerManager живет в той же теме. Теперь предположим последовательность действий:

  1. Worker вызывает класс слушателя, чтобы сообщить результат в середине метода
  2. WorkerManager (который слушатель Worker) решает удалить / изменить Worker учебный класс
  3. Worker продолжить выполнение метода, будучи удален из модифицированный. Программист должен учитывать эти ситуации, и это сложно и подвержено ошибкам.

В коде это может выглядеть так:

// in worker.cpp

void Worker::SomeMethod() {
...
listener_->OnWorkDone(this); // removed here by listener
workDone_ = true; // memory corruption
...
}// in worker_manager.cpp

void WorkerManager::OnWorkerWorkDone(Worker* worker) {
RemoveWorker(worker);
}

Как это можно изменить:

// in worker.cpp

void Worker::DoSomeWork() {
workDone = false;
...
}

void Worker::SomeMethod() {
...
listener_->OnWorkDone(this); // sets workDone to false here by DoSomeWork()
workDone_ = true; // but SomeMethod doesn't aware of it
...
}// in worker_manager.cpp

void WorkerManager::OnWorkerWorkDone(Worker* worker) {
worker->DoSomeWork(); // do another work
}

Теперь я вижу эти решения проблемы:

  • Установите в руководстве по стилю кода, что класс слушателя должен быть вызван последним. Но это довольно хрупкое и подверженное ошибкам решение.
  • Сделано вроде QT соединений с очередями.

Соединения в очереди QT выполняются в мета-объектной системе, и это слишком много для моего проекта. Мне нужен более простой инструмент, который позволил бы мне откладывать обратные вызовы слушателя в цикле событий потока.

Я считаю, что эта проблема распространена в управляемом событиями дизайне. Где я могу увидеть примеры того, как это можно сделать?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]