多线程 – 将QList *传递给来自QThread的信号
发布时间:2020-12-15 04:11:08 所属栏目:Java 来源:网络整理
导读:在我的qt应用程序中,我有一个类(worker),它是从一个在线程中运行的对象调用的.在我的worker类中,我创建了QList,就像这样 QList QString albums;while (i.hasNext()){ QRegularExpressionMatch album = i.next(); albums.append(album.captured("album"));}em
在我的qt应用程序中,我有一个类(worker),它是从一个在线程中运行的对象调用的.在我的worker类中,我创建了QList,就像这样
QList <QString> albums; while (i.hasNext()) { QRegularExpressionMatch album = i.next(); albums.append(album.captured("album")); } emit SignalGotAlbums(albums); 我在另一个包含我的worker的类中接收到这个信号,用于线程使用.我们将此类称为GetAlbumsThread.在那里我成功地在一个插槽中接收SignalGotAlbums void GetAlbumsThread::Reply(QList <QString> &list) { emit gotAlbums(list); emit finished(); } 在这个插槽中,我发射另一个信号gotAlbums,假设与我的gui线程中的一个插槽连接,并在那里传递我的QList.我的问题是,当我试图将QList从一个线程传递给gui时,它只是不起作用!插槽没有收到gotAlbums信号; 信号声明如下: void gotAlbums(QList<QString> &); 并连接到我的gui插槽(当然在我的gui线程中): private slots: void AlbumsReceived(QList<QString> &list) ... QThread* albumsThread = new QThread(); GetAlbumsThread *albumsObject = new GetAlbumsThread(); albumsObject->moveToThread(albumsThread); connect(albumsThread,SIGNAL(started()),albumsObject,SLOT(process())); connect(albumsObject,SIGNAL(gotAlbums(QList<QString> &)),this,SLOT(AlbumsReceived(QList<QString> &)); albumsThread->start(); AlbumsReceived因某些原因从未被调用过. connect返回true.有人可以帮我弄这个吗.我认为问题在于线程之间传递QList. 解决方法
这里的问题是你正在使用信号/槽的引用,即QList< QString> &放;.这与线程不兼容,因为它们使用自己的私有堆栈,在这种情况下,您所做的是将指针从一个线程传递到另一个线程.
可能性是: >使用原始QList< QString>信号/插槽,将强制复制. 以下代码说明了这两种方法: // A.h #include <QObject> #include <QDebug> class A: public QObject { Q_OBJECT public slots: void foo(int i) { qDebug() << i; } void bar(QList<int> l) { foreach(int i,l) qDebug() << i; } void bar2(QList<int> * l) { foreach(int i,*l) qDebug() << i; } }; // Worker.h #include <QObject> class Worker: public QObject { Q_OBJECT public slots: void process() { // pass an int emit foo(1); // pass a list by value emit bar(QList<int>() << 2 << 3 << 4); // pass a poniter to a list list = new QList<int>(); *list << 5 << 6 << 7; emit bar2(list); emit finished(); } signals: void finished(); void foo(int); void bar(QList<int>); void bar2(QList<int> *); private: QList<int> * list; }; // main.cpp #include <QApplication> #include <QThread> #include <QObject> #include "A.h" #include "Worker.h" int main(int argc,char** argv) { QApplication app(argc,argv); A * a = new A(); Worker * worker = new Worker(); QObject::connect(worker,SIGNAL(foo(int)),a,SLOT(foo(int))); QObject::connect(worker,SIGNAL(bar(QList<int>)),SLOT(bar(QList<int>))); QObject::connect(worker,SIGNAL(bar2(QList<int>*)),SLOT(bar2(QList<int>*))); QThread * thread = new QThread(); worker->moveToThread(thread); QObject::connect(thread,worker,SLOT(process())); QObject::connect(worker,SIGNAL(finished()),thread,SLOT(quit())); QObject::connect(thread,&app,SLOT(quit())); thread->start(); return app.exec(); } 输出: 1 2 3 4 5 6 7 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |