0

https://www.qt.io/blog/2006/12/04/threading-without-the-headacheは、裸のポインターを交換していて、Qtを使用していないという不満を持っています:: QueuedConnection。

編集:上記のリンクが示すコードスニペットは次のとおりです(この投稿の前にリンクがダウンした場合)

// create the producer and consumer and plug them together
Producer producer;
Consumer consumer;
producer.connect(&consumer, SIGNAL(consumed()), SLOT(produce()));
consumer.connect(&producer, SIGNAL(produced(QByteArray *)), SLOT(consume(QByteArray *)));

// they both get their own thread
QThread producerThread;
producer.moveToThread(&producerThread);
QThread consumerThread;
consumer.moveToThread(&consumerThread);

// go!
producerThread.start();
consumerThread.start();

プロデューサーでunique_ptrを使用し、プロデュースされたシグナルを呼び出したときにそれを解放し、接続されたコンシューマースロットの別の一意のポインターにネイキッドポインターを直接配置すると、多少安全になります。特に、メンテナンスプログラマーがコードを試した後;)

void calculate()
{
    std::unique_ptr<std::vector<int>> pi(new std::vector<int>());
    ...
    produced(pi.release());     
    //prodiced is a signal, the connected slot destroys the object
    //a slot must be connected or the objects are leaked
    //if multiple slots are connected the objects are double deleted
}

void consume(std::vector<int> *piIn)
{
    std::unique_ptr<std::vector<int>> pi(piIn);
    ...
}

これにはまだいくつかの大きな問題があります。

  • スロットが接続されていないときの漏れから保護していません
  • 複数のスロットが接続された場合、二重削除から保護していません(それが発生した場合、プログラマー側の論理エラーになるはずですが、それを検出したいと思います)
  • 輸送中に漏れがないことを確認するのに十分なQtの内部動作をよく知りません。

共有ポインターを使用してconstを実行すると、すべての問題は解決しますが、速度は遅くなります。私が知る限り、ここで説明するように、メタオブジェクトシステムに登録する必要があります。http://qt-project.org/ doc / qt-4.8 / qt.html#ConnectionType-enumこれは良い考えですか?

私が考えていない、これを行うためのより良い方法はありますか?

4

1 に答える 1

0

スロットが使用できない可能性があるため、スロットがポインタを破壊することを期待している間は、信号でポインタを渡さないでください。

代わりにconst参照を渡し、スロットがオブジェクトをコピーできるようにします。Qtのコンテナクラスを使用する場合、Qtのコンテナクラスはコピーオンライトを実装するため、これによってパフォーマンスが低下することはありません。

于 2012-11-28T16:35:06.787 に答える