0

我对这个很好的例子的抱怨:https ://www.qt.io/blog/2006/12/04/threading-without-the-headache是它正在交换裸指针并且它没有使用 Qt::排队连接。

编辑:这是上面链接显示的代码片段(以防链接在这篇文章之前关闭)

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