加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

多线程 – 将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>信号/插槽,将强制复制.
>分配QList< QString>使用new(因此将进入堆而不是堆栈),并使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读