В моем приложении, управляемом событиями, у меня есть общая проблема. Предположим, следующая диаграмма классов:
Я использую шаблон наблюдателя здесь. Worker
а также WorkerManager
живет в той же теме. Теперь предположим последовательность действий:
Worker
вызывает класс слушателя, чтобы сообщить результат в середине методаWorkerManager
(который слушатель Worker
) решает удалить / изменить Worker
учебный класс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 выполняются в мета-объектной системе, и это слишком много для моего проекта. Мне нужен более простой инструмент, который позволил бы мне откладывать обратные вызовы слушателя в цикле событий потока.
Я считаю, что эта проблема распространена в управляемом событиями дизайне. Где я могу увидеть примеры того, как это можно сделать?
Задача ещё не решена.
Других решений пока нет …