2012-11-28 1 views
0

다른 좋은 예가 있습니다. 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 이것이 좋은 생각입니다. ?

내가 생각할 수없는 더 좋은 방법이 있나요?

답변

0

슬롯을 사용할 수 없기 때문에 슬롯을 파괴하려고 할 때 신호에 포인터를 전달하면 안됩니다.

대신 const 참조를 전달하여 슬롯에서 객체를 복사 할 수있게합니다. Qt의 컨테이너 클래스를 사용하면 Qt의 컨테이너 클래스가 copy-on-write를 구현하므로 성능을 저해하지 않아야합니다.

+0

죄송합니다. 예제에서 Qt :: QueuedConnection을 사용하지 않았기 때문에 모든 상황이 바뀌 었습니다. – odinthenerd

+0

그런 다음 단순히 값으로 전달하고 QList의 컨테이너 클래스 (QList, QVector 등)를 사용하십시오. 왜냐하면 어쨌든 COW를 구현하거나 QSharedPointer와 같은 공유 포인터를 사용하기 때문입니다. 더 나은 방법이 있는지 물었습니다. AFAIK는 없습니다. – sashoalm

+0

ok thatks, QSharedPointer로 구현 중입니다. (처음 QSharedPointer를 처음 사용했을 때). – odinthenerd