0

在我的事件驱动应用程序中,我遇到了常见问题。假设如下类图:

类图

我在这里使用观察者模式。Worker并且WorkerManager生活在同一个线程中。现在假设动作序列:

  1. Worker在方法中间调用监听器类报告结果
  2. WorkerManager(监听器Worker)决定删除/修改Worker
  3. 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 排队连接是在元对象系统上建立的,这对我的项目来说太多了。我需要一个更简单的工具,允许我在线程的事件循环中推迟侦听器回调。

我相信这个问题在事件驱动设计中很常见。我在哪里可以看到如何处理它的示例?

4

0 回答 0