Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过引用将值传递给线程并修改_C++_Qt - Fatal编程技术网

C++ 通过引用将值传递给线程并修改

C++ 通过引用将值传递给线程并修改,c++,qt,C++,Qt,我想在线程中通过引用修改Qlist,因为排序可能需要几秒钟 但似乎我无法修改列表。在线程之外,列表尚未更改 在qmain窗口中: QThread *thread = new QThread(); FarmSortWorker *farmsort_worker = new FarmSortWorker(); farmsort_worker->setFarmData(farm_list); farmsort_worker->moveToThread(thread)

我想在线程中通过引用修改Qlist,因为排序可能需要几秒钟

但似乎我无法修改列表。在线程之外,列表尚未更改

在qmain窗口中:

QThread *thread = new QThread();
    FarmSortWorker *farmsort_worker = new FarmSortWorker();
    farmsort_worker->setFarmData(farm_list);
    farmsort_worker->moveToThread(thread);

    connect(farmsort_worker, &FarmSortWorker::error, [=](QString error_msg){
        qDebug() << error_msg;
        logger->logEvent(error_msg, Logger::ERROR);
    });
    connect(thread, &QThread::started, farmsort_worker, &FarmSortWorker::processSort);
    connect(farmsort_worker, &FarmSortWorker::finished, thread, &QThread::quit);
    connect(farmsort_worker, &FarmSortWorker::finished, farmsort_worker, &QThread::deleteLater);
    connect(thread, &QThread::finished, thread, &QThread::deleteLater);
    thread->start();
QThread*thread=new QThread();
FarmSortWorker*farmsort_worker=新的FarmSortWorker();
农场排序工人->设置农场数据(农场列表);
farmsort\u worker->moveToThread(线程);
连接(farmsort\u worker,&FarmSortWorker::error,[=](QString error\u msg){
qDebug()日志事件(错误消息,记录器::错误);
});
连接(线程,&QThread::started,farmsort\u worker,&FarmSortWorker::processSort);
连接(farmsort\u worker,&FarmSortWorker::finished,thread,&QThread::quit);
connect(farmsort\u worker和FarmSortWorker::finished、farmsort\u worker和QThread::deleteLater);
连接(线程,&QThread::finished,线程,&QThread::deleteLater);
线程->开始();
我的线程(.h)

\ifndef FARMSORTWORKER\H
#定义农场工人
#包括
#包括“./framcontainer.h”
#包括
#包括
#包括
类FarmSortWorker:公共QObject
{
Q_对象
公众:
显式FarmSortWorker(QObject*parent=0);
~FarmSortWorker();
void setFarmData(QList和farm_容器);
私人:
QList农场集装箱;
信号:
无效错误(QString错误);
无效完成();
公众时段:
void processSort();
};
#endif//FARMSORTWORKER\u H
我的线程(.cpp)

#包括“farmsortworker.h”
FarmSortWorker::FarmSortWorker(QObject*父对象):
QObject(父对象)
{
}
FarmSortWorker::~FarmSortWorker()
{
}
void FarmSortWorker::setFarmData(QList和farm_容器)
{
此->农场容器=农场容器;
}
void FarmSortWorker::processSort()
{
qDebug()这是因为您在thread类中保存了列表的副本,而不是引用

与其使用单独的函数来设置列表,不如(通过引用)将其传递给构造函数,并让它设置引用变量:

class FarmSortWorker : public QObject
{
    Q_OBJECT
public:
    explicit FarmSortWorker(QList<FramContainer>& list, QObject *parent = 0);

    ...

private:
    QList<FramContainer>& farm_container;  // Store as a reference

    ...
};

...

FarmSortWorker::FarmSortWorker(QList<FramContainer>& list, QObject *parent) :
    QObject(parent), farm_container(list)
{
}

...

QThread *thread = new QThread();
FarmSortWorker *farmsort_worker = new FarmSortWorker(farm_list);

...
类FarmSortWorker:公共QObject
{
Q_对象
公众:
显式FarmSortWorker(QList&list,QObject*parent=0);
...
私人:
QList&farm_container;//存储为引用
...
};
...
FarmSortWorker::FarmSortWorker(QList&list,QObject*父对象):
QObject(父对象)、场容器(列表)
{
}
...
QThread*thread=新的QThread();
FarmSortWorker*farmsort\u worker=新的FarmSortWorker(farm\u列表);
...

是否需要通过构造函数传递它?@user2357505是的,引用成员变量必须使用构造函数中的初始值设定项列表进行初始化。如果我传递指向setFarmData数据的指针,为什么会这样:FramContainer park=(*farm\u container\u test)[i];park.setFarmName(“test”);不更改值?它应该是一个引用。@user2357505变量
park
只是一个副本,因此更改该对象只会更改该对象。正如您问题中的代码中所示,您有一个引用列表中原始值的指针。您还可以将
park
声明为引用,如
FarmContainer&公园=农场/集装箱[i];
#include "farmsortworker.h"

FarmSortWorker::FarmSortWorker(QObject *parent) :
    QObject(parent)
{
}

FarmSortWorker::~FarmSortWorker()
{
}


void FarmSortWorker::setFarmData(QList<FramContainer> &farm_container)
{

    this->farm_container = farm_container;
}


void FarmSortWorker::processSort()
{
    qDebug() << "count:" << farm_container.size();
    for(int i = 0; i < farm_container.size(); i++)
    {

        FramContainer park = farm_container.at(i);
        qDebug() << "original:" << park.getFarmName();

    }
    for(int i = 0; i < farm_container.size(); i++)
    {
        FramContainer *park =& farm_container[i];
        park->setFarmName("test");


    }
    for(int i = 0; i < farm_container.size(); i++)
    {

        FramContainer park = farm_container.at(i);
        qDebug() << "neu:" << park.getFarmName();

    }

    emit finished();
}
class FarmSortWorker : public QObject
{
    Q_OBJECT
public:
    explicit FarmSortWorker(QList<FramContainer>& list, QObject *parent = 0);

    ...

private:
    QList<FramContainer>& farm_container;  // Store as a reference

    ...
};

...

FarmSortWorker::FarmSortWorker(QList<FramContainer>& list, QObject *parent) :
    QObject(parent), farm_container(list)
{
}

...

QThread *thread = new QThread();
FarmSortWorker *farmsort_worker = new FarmSortWorker(farm_list);

...