2015-12-29 2 views
1

Я пытаюсь использовать QThread в своем application для обработки больших данных. Он работает, но не совершенен и сбой моего приложения в его текущей версии по ссылке. Я где-то читал (не могу найти ссылку), чтобы вместо этого использовать QTimer, а также сигнальные и слоты.QTimer для обработки большого массива

То, что я хотел бы сделать, это быть в состоянии перебрать:

connect(this, &UsersProcess::ProgressBarSetValue, this->progressBar, &QProgressBar::setValue); 

... 
int maxRows = this->listUsers->size(); 
for(auto iter = this->listUsers->begin(); iter != this->listUsers->end(); ++iter) 
{ 
    row++; 
    emit this->ProgressBarSetValue(row); 
} 

где ProgressBarSetValue сигнал обновляет значение QProgressBar. Что я не уверен, что делать, это поместить его в QTimer, чтобы он не приводил к тому, что MainWindow не использовался до тех пор, пока цикл не закончится.

Удивительно, если кто-нибудь может дать мне идею или статью о том, как это сделать. Или если есть другие альтернативы без использования QThread.

+0

Возможный дубликат [бар QT Прогресс, показывающий состояние функции] (http://stackoverflow.com/questions/22551978/qt-progress-bar-showing-status-of-a-function) – user2672165

ответ

1

Посмотрите на QtConcurrent lib. QtConcurrent :: run может помочь вам.

Пример. В userprocess.h:

class UserProcess : public QMainWindow 
{ 
    Q_OBJECT 

public: 
.............. 
    void setValue(int Value); 

signals: 
    void ProgreeBarSetValue(int Value); 

private: 
    Ui::UserProcess *ui; 
    QStringList _data; 
}; 

В .cpp Вы определяете эту функцию:

void doWork(UserProcess* process, const QStringList &list) 
{ 
    static int row = 0; 
    for(auto iter = list.begin(); iter != list.end(); ++iter) 
    { 
     ++row; 
     process->setValue(row); 
     QThread::msleep(1); //just slows up this function 
    } 
} 

Затем вы делаете вы связь с Qt: QueuedConnection флаг:

connect(this, &UserProcess::ProgreeBarSetValue, ui->progressBar, &QProgressBar::setValue, Qt::QueuedConnection); 

Добавьте случайные данные в наш список

for(int i = 0; i < 1000; ++i) 
     _data.append(QString::number(i)); 

ui->progressBar->setMaximum(1000); 

И это

void UserProcess::setValue(int Value) 
{ 
    emit ProgreeBarSetValue(Value); 
} 

Начало наша тяжелая функция

QtConcurrent::run(doWork, this, _data); 

DonT Также забудьте добавить это в файл .pro

QT += concurrent 
Смежные вопросы