在我的事件驱动应用程序中,我遇到了常见问题。假设如下类图:
我在这里使用观察者模式。Worker
并且WorkerManager
生活在同一个线程中。现在假设动作序列:
Worker
在方法中间调用监听器类报告结果WorkerManager
(监听器Worker
)决定删除/修改Worker
类Worker
继续执行方法,删除modified。程序员必须考虑这些情况,而且复杂且容易出错。
在代码中它可能看起来像这样:
// 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 排队连接是在元对象系统上建立的,这对我的项目来说太多了。我需要一个更简单的工具,允许我在线程的事件循环中推迟侦听器回调。
我相信这个问题在事件驱动设计中很常见。我在哪里可以看到如何处理它的示例?