2017-06-24 6 views
1

I Problem gestoßen bin, als ich versucht habe QVector> zwischen Threads durch die Warteschlange gestellt Signal-Schlitz-Verbindung (Tester ist meine Klasse, die QObject erbt) zu sendenSenden QVector von QSharedPointers durch Warteschlange Qt Signal-Slot-Verbindung

Wenn ich versuche einfach Signal \ Schlitz mit einer solchen QVector zu verbinden als Argument Programm während der Lauf sagt, dass diese Metatyp registriert werden soll (obwohl QVector, QSharedPointer und Klasse von QObject geerbt automatisch registriert werden.

ich habe versucht, das Hinzufügen

typedef QVector<QSharedPointer<Tester> > TestPointerVector; 
Q_DECLARE_METATYPE(TestPointerVector); 

nach Erklärung der Tester-Klasse und in dem Haupt()

qRegisterMetaType<TestPointerVector>(); 

In diesem Fall habe ich Fehler in qmetatype.h и qtypeinfo.h Kompilieren mir zu sagen, dass QVector> unvollständiger Typ ist und dass sizeof solchen Vektor kann‘ t berechnet werden.

Was ist der richtige Weg, um dieses Register Metatypie Sache zu tun?

Mein Test main() sieht wie folgt:

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    qRegisterMetaType<TestPointerVector>(); 
    Receiver* rcv = new Receiver(0); 
    Emitter* emt = new Emitter(0); 
    QThread* thread = new QThread(); 
    QObject::connect(rcv, SIGNAL(finished()), thread, SLOT(quit())); 
    QObject::connect(rcv, SIGNAL(finished()), rcv, SLOT(deleteLater())); 
    QObject::connect(emt, SIGNAL(send(TestPointerVector)), rcv, 
    SLOT(receive(TestPointerVector)), Qt::QueuedConnection); 
    rcv->moveToThread(thread); 
    thread->start(); 
    emt->process(); 

    while(!thread->isFinished()) 
     continue; 
    return a.exec(); 
} 
+2

'#include ' –

+0

@ jesper-juhum Nein, QVector und QSharedPointer sind bereits enthalten, daher ist das Problem nicht hier. –

+0

Nicht sicher, ob das die Sache im Thema betrifft aber: 'while (! Thread-> isFinished()) weitermachen;' ist einfach falsch. Sie verhindern, dass der Code in die Hauptthreadcode-Ereignisschleife gelangt und nicht erklärt, warum der 'thread' zuvor beendet wurde. – AlexanderVX

Antwort

0

gefunden Problem, es war nicht in qRegisterMetaType Teil. Problem war, dass ich Qvector < ...> in Signal \ Slot-Signaturen verwendet habe, habe ich es in const QVector < ...> & geändert und alles begann zu arbeiten.

Und wenn QSharedPointer im Emitter-Thread gelöscht wird, würde es immer noch vom Empfänger empfangen werden und die Daten werden nicht beschädigt (was ich in diesem Beispiel testen wollte).

Verwandte Themen