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これは良い考えですか?
私が考えていない、これを行うためのより良い方法はありますか?