Как объединить / добавить / добавить две модели для создания потоков в Qt? - PullRequest
0 голосов
/ 04 сентября 2018

Я новичок, поэтому, если это сообщение не в том месте, просто сообщите мне, пожалуйста.

Я пытаюсь использовать потоки для "для циклов" в моей программе, но согласно моим исследованиям model->setData не совместимо с потоками.

Итак, мои решения:
Я буду использовать разные модели в каждом потоке, а затем объединю их в одну, чтобы показать в виде таблицы.

Но я не знаком с Qt, поэтому я застрял здесь, я не знаю, как объединить две модели друг с другом, не могли бы вы проверить мой код?

{
    t2 = std::thread{[&]{
        const auto row_size = (RegexOperations_.indexed_arranged_file.size()
        const auto col_size = RegexOperations_.indexed_arranged_file[0].size();
        for(unsigned int i = 0 ; i < (row_size+1) / 2)  ; i++)
        {
            for(unsigned int j = 0 ; j < col_size;j++)
            {
                std::string temp = RegexOperations_.indexed_arranged_file[i][j];
                QModelIndex index = model ->index(i,j,QModelIndex());
                model->setData(index,temp.c_str());
            }
        }
    }};

    //t3 = std::thread{[&]{
    //    const auto row_size = (RegexOperations_.indexed_arranged_file.size()
    //    const auto col_size = RegexOperations_.indexed_arranged_file[0].size();
    //    for(unsigned int i = (row_size+1) / 2) ; i < row_size;i++)
    //    {
    //        for(unsigned int j = 0 ; j < col_size;j++)
    //        {
    //            std::string temp = RegexOperations_.indexed_arranged_file[i][j];
    //            QModelIndex index = model ->index(i,j,QModelIndex());
    //            model->setData(index,temp.c_str());
    //        }
    //    }
    //}};

    t2.join();
    //t3.join();

    const auto tvr = ui->tableView_results;
    tvr->setModel(model);
    tvr->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
    tvr->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

Спасибо за вашу помощь ...

1 Ответ

0 голосов
/ 04 сентября 2018

Это один из способов сделать это.

vector<std::string> answers;
std::mutex mx_answers;

auto rows = RegexOperations_.indexed_arranged_file.size();
auto cols = RegexOperations_.indexed_arranged_file[0].size();
answers.reserve(rows *cols);
auto answers_fill_it = answers.begin();

vector<std::thread> ts;
ts.reserve(rows);
auto rows = RegexOperations_.indexed_arranged_file.size();
for (row = 0; row < rows; ++row)
{
    ts.emplace_back([&](
        vector<std::string> local_answers;
        local_answers.reserve(cols);
        for (unsigned col = 0; col < cols; ++col) {
            local_answers.push_back(RegexOperations_.indexed_arranged_file[row][col]);
        };
        lock_guard<std::mutex> lk(mx_answers);
        std::copy(local_answers.begin(), local_answers.end(), answers_fill_it);));
}
auto answer_it = answers.begin();

for (auto t & : ts)
    if (t.joinable())
        t.join();

for (auto row = 0; row < rows; ++row)
    for (auto col = 0; col < cols; ++col)
    {
        QModelIndex index = model->index(row, col, QModelIndex());
        model->setData(index, *answer_it;
        ++answer_it;
    }

Он разбивает его на потоки в каждой строке и по завершении каждого потока добавляет результаты этой строки в глобальный вектор строк.

После завершения всех потоков модель обновляется.

...