0

私のイベント駆動型アプリケーションには、共通の問題があります。次のクラス図を想定します。

クラス図

ここではオブザーバーパターンを使用しています。Worker同じスレッドにWorkerManager住んでいます。次に、一連のアクションを想定します。

  1. Workerメソッドの途中でリスナークラスを呼び出して結果を報告する
  2. WorkerManager(これは のリスナーです)クラスWorkerを削除/変更することを決定しますWorker
  3. Workermodifiedを削除して、メソッドの実行を継続します。プログラマーはこれらの状況を考慮する必要があり、複雑でエラーが発生しやすくなります。

コードでは、次のようになります。

// 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