私のイベント駆動型アプリケーションには、共通の問題があります。次のクラス図を想定します。
ここではオブザーバーパターンを使用しています。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 キュー接続はメタオブジェクト システムで行われ、私のプロジェクトには多すぎます。スレッドのイベント ループでリスナーのコールバックを延期できる、よりシンプルなツールが必要です。
この問題は、イベント ドリブン デザインではよくあることだと思います。処理方法の例はどこで見ることができますか?