@yankeenoobs

Как использовать QtConcurrent?

Как использовать функцию QtConcurrent::map();
Имеется
Что не верно в коде ?
void MainWindow::processing_list(QStringList &line)
{
    //******
}
QStringList lst;
QtConcurrent::map(&lst,&this->processing_list);


Компилятор ругается:
no match for call to '(QtConcurrent::MemberFunctionWrapper1<void, MainWindow, QStringList&>) (QString&)'
         map(*it);
  • Вопрос задан
  • 4281 просмотр
Пригласить эксперта
Ответы на вопрос 2
@TriKrista
Попробуйте передать не ссылки, а объекты:

...
QtConcurrent::map(lst, this->processing_list);
...


...

вот так у меня работает:
#include <QCoreApplication>
#include <QFuture>
#include <QtConcurrent/QtConcurrent>
#include <QString>
#include <QDebug>

void test(QString &str) {
    qDebug() << str << " | ";
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QStringList strings;
    strings << "test" << "test1";
    QFuture<void> squeezedStrings = QtConcurrent::map(strings, &test);

    return a.exec();
}


и вот так у меня работает:
//mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QStringList>
#include <QFuture>
#include <QtConcurrent/QtConcurrent>
#include <QObject>

class MainWindow : public QObject
{
public:
    MainWindow(QObject *parent = 0);
    void start();
    QStringList lst;

private:
    static void processing_list(QString &line);
};

#endif // MAINWINDOW_H


//mainwindow.cpp

#include "mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QObject *parent) : QObject(parent){

}

void MainWindow::start() {
    lst << "test" << "test1";
    QtConcurrent::map(lst, &this->processing_list);
}

void MainWindow::processing_list(QString &line) {
    qDebug() << line;
}
Ответ написан
@yankeenoobs Автор вопроса
TriKrista: Вообщем не подошло мне это всё извращение, поэтому написал все в QThread и циклом проходя на каждом процессоре свою порцию данных, но я не заметил увеличения ускорения , скорее даже наоборот. Подозреваю что всё дело в том что каждое ядро в цикле обходит список, и каждый новый элемент ищет по очереди, ведь объекты QList
ParsingFile::ParsingFile(QList<QString> &list_string, int num_core, QObject *parent): QThread(parent)
{
    this->row = &list_string;
    this->number_core = num_core;
    //qDebug() << "start core: " << number_core << endl;
}
void ParsingFile::run()
{
    int maxThread = QThread::idealThreadCount();
    for(int p=this->number_core; p < this->row->count(); p=p+maxThread)
    {
        QString tmp = row->at(p);
        DATA_Channel T;
        QString arg= "";
        bool quote = false;
        int num_arg = 0;
        for(int i=0; i<tmp.length(); i++)
        {
           ******
        }
        this->channel.push_back(T);
    }
    emit result_parse(this->channel);
}


Создание потоков происходит в таком виде
int core = QThread::idealThreadCount();
    for(int i=0; i<core; i++)
    {
        this->threads.push_back( new ParsingFile(row_lst,i) );
        this->threads[i]->start(QThread::HighestPriority);
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы