다른 좋은 예가 있습니다. http://blog.qt.digia.com/blog/2006/12/04/threading-without-the-headache/ QT :: QueuedConnection을 사용하지 않고 누드 포인터를 교환하고 있습니다.QThreads를 사용하여 자물쇠를 사용하지 않는 생산자 소비자 스레드를보다 안전하게 예외 교환하는 방법
편집 : 여기에 코드가 나는 생산자에 unique_ptr을 사용하는 경우 나 생성 신호를 호출 할 때 그것을 풀어
// 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();
(링크는이 게시물 이전에 다운 될 경우) 위의 링크 쇼를 니펫 알맞은 포인터를 연결된 소비 슬롯의 다른 고유 한 포인터에 직접 놓으면 다소 안전합니다. ; 특히 일부 유지 보수 프로그래머가 코드에서 이동을 한 후이 아직 몇 가지 중요한 문제가
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);
...
}
) : 슬롯이 연결되어 있지 않을 때 - 난 누출에 대한 보호하고 있지 않다을 -I 두 번에 대한 보호하고 있지 않다 여러 슬롯이 연결되면 삭제합니다 (프로그래머가 논리적으로 오류가 발생하면이를 감지해야하지만이를 감지하고 싶습니다). - Qt의 내부 작업에 대해 충분히 알지 못합니다. 운송 중에 누수가 없습니다.
const에 공유 포인터를 사용하면 내 모든 문제가 해결되지만 속도가 느려지고 여기까지 설명한대로 메타 오브젝트 시스템에 등록해야한다는 것을 알고있는 한 : http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum 이것이 좋은 생각입니다. ?
내가 생각할 수없는 더 좋은 방법이 있나요?
죄송합니다. 예제에서 Qt :: QueuedConnection을 사용하지 않았기 때문에 모든 상황이 바뀌 었습니다. – odinthenerd
그런 다음 단순히 값으로 전달하고 QList의 컨테이너 클래스 (QList, QVector 등)를 사용하십시오. 왜냐하면 어쨌든 COW를 구현하거나 QSharedPointer와 같은 공유 포인터를 사용하기 때문입니다. 더 나은 방법이 있는지 물었습니다. AFAIK는 없습니다. – sashoalm
ok thatks, QSharedPointer로 구현 중입니다. (처음 QSharedPointer를 처음 사용했을 때). – odinthenerd