1

並べ替えに数秒かかる可能性があるため、スレッド内の参照によって Qlist を変更したいと考えています。

しかし、リストを変更できないようです。スレッドの外では、リストは変更されていません。

QMainwindow で:

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();

マイ スレッド (.h)

#ifndef FARMSORTWORKER_H
#define FARMSORTWORKER_H

#include <QObject>
#include "../framcontainer.h"

#include <QList>
#include <qDebug>
#include <QString>

class FarmSortWorker : public QObject
{
    Q_OBJECT
public:
    explicit FarmSortWorker(QObject *parent = 0);
    ~FarmSortWorker();
    void setFarmData(QList<FramContainer> &farm_container);

private:
    QList<FramContainer> farm_container;

signals:
    void error(QString error);
    void finished();

public slots:
    void processSort();

};

#endif // FARMSORTWORKER_H

マイ スレッド (.cpp)

#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();
}

よろしくお願いします。

4

1 に答える 1

3

これは、参照ではなく、リストのコピーをスレッド クラスに保存するためです。

リストを設定する別の関数を用意する代わりに、(参照によって) コンストラクターに渡し、参照変数を設定します。

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);

...
于 2013-08-14T13:11:03.417 に答える