Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426

Многопоточность в вычислениях функции

16.11.2017, 17:54. Показов 4068. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Скажите пожалуйста, как в функции вычисление qDebug()<<i*a; проводить в разных потоках, ускоряя таким образом вычисления?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
void MainWindow::StrategyCod() //код стратегии
{
    for (int i=0;i<2000000;++i)
    {
        for (int a=0;a,2000000;++a)
        {
            qDebug()<<i*a;
        }
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2017, 17:54
Ответы с готовыми решениями:

Приложение блокируется при длительных вычислениях
Добрый день! Прошу помощи! Наверняка этот вопрос уже задавали - я просто не знаю, что искать. В общем задача такова. Имеется форма с...

Многопоточность в вычислениях
Привет всем. Написал такой код. #include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;process.h&gt; #include &lt;stdio.h&gt; using...

Многопоточность при математических вычислениях с выводом в ListBox
Здравствуйте! Есть две функции (с параметрами) математических вычислений. Вычисления производятся параллельно в двух потоках. Результат...

39
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
17.11.2017, 11:51  [ТС]
Студворк — интернет-сервис помощи студентам
Проще создать QCector co значениями, нежели функцию.
Но из моих вычислений никуда результаты возвращать не нужно.
Скажите пожалуйста, если я использую QtConcurrent :: map , то будет ли также выполнятся автоматическая многопоточность?
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
17.11.2017, 12:06

Не по теме:

КХА!!!! Кхым!.. Кхе-кхе-хем!.. Извините, от неожиданности вопроса я аж ссылкой на doc.qt.io поперхнулся.


Да.

Добавлено через 1 минуту
Оптимальная для вашего устройства, в зависимости от числа ядер и нитей (для HyperThreading). Оптимальность вычисляется на ходу.
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
17.11.2017, 13:38  [ТС]
тогда при наличии функции
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
void MainWindow::StrategyCod(int a) //код стратегии
{
    int i =a;
    for ( i=0;i<2000000;++i)
    {
        for (int a=0;a,2000000;++a)
        {
            qDebug()<<i*a;
        }
    }
}
и вектора QVector<double> Perebor; дублирующий значения for ( i=0;i<2000000;++i)
для многопоточности этой функции ввожу параметр а (вместо for ( i=0;i<2000000;++i) ) для перебора.
C++ (Qt)
1
2
3
4
5
6
7
8
void MainWindow::StrategyCod(int a) //код стратегии
{
    int i =a;   
        for (int a=0;a,2000000;++a)
        {
            qDebug()<<i*a;
        }
}
то как теперь правильно написать вызов в мэйне w.makePlot(а); с помощью QtConcurrent :: map ?
может быть так: QtConcurrent::map(Perebor, w.makePlot);
не совсем понимаю как прописать использование элемента вектора Perebor вместо переменной а?

Добавлено через 57 минут
Пытаюсь вызвать так и так:
C++ (Qt)
1
2
3
QtConcurrent::map(w.Perebor,w.StrategyCod1());
QtConcurrent::map(w.Perebor.begin(),w.Perebor.end(),w.StrategyCod1());
QtConcurrent::map(w.Perebor.begin(),w.Perebor.end(),w.StrategyCod1);
Но выдает ошибку. Скажите пожалуйста, как использовать QtConcurrent::map
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.11.2017, 14:05
В контейнере должно быть столько элементов, сколько частей в диапазоне. Если задавать начальный индекс, а количество итераций зафиксировать, то примерно так:
C++ (Qt)
1
2
QVector<int> Perebor = {0, 1000000};
QFuture<int> r = QtConcurrent::map(Perebor.begin(), Perebor.end(), StrategyCod);
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
void MainWindow::StrategyCod(int n)
{
    for (i = n; i < n + 1000000; ++i)
    {
        for (int a = 0; a < 2000000; ++a)
        {
            qDebug() << i * a;
        }
    }
}
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
17.11.2017, 14:14  [ТС]
выдает ошибки:
C:\Qt\project\MyCandleSrick\mainwindow.h :47: ошибка: could not convert 'QtConcurrent::map(Iterator, Iterator, MapFunctor) [with Iterator = double*; MapFunctor = void (MainWindow::*)(double)](((MainWindow*)this)->MainWindow::Perebor.QVector<T>::end<dou ble>(), &MainWindow::StrategyCod1)' from 'QFuture<void>' to 'QFuture<double>'
QFuture<double> Perebor2 = QtConcurrent::map(Perebor.begin(), Perebor.end(), StrategyCod1);
^
и:
C:\Qt\Qt5.9.2\5.9.2\mingw53_32\include\Q tConcurrent\qtconcurrentmapkernel.h:69: ошибка: no match for call to '(QtConcurrent::MemberFunctionWrapper1<v oid, MainWindow, double>) (double&)'
map(*it);
^
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.11.2017, 14:29
Внимательно сверь мой фрагмент с тем, что там у тебя.
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
17.11.2017, 14:50  [ТС]
Проверил и попробовал в разных интерпретациях покрутить. Все равно ошибки.
C++ (Qt)
1
2
QVector<int> Perebor = {0, 1000000};
QFuture<int> r = QtConcurrent::map(Perebor.begin(), Perebor.end(), StrategyCod);
ведь в хедер это записывается?

Добавлено через 15 минут
но пробовал вставлять и в срр. все равно не работает. не могли бы вы скинуть ваш проект?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.11.2017, 15:32
В какой хедер? Все реализации должны быть в cpp. У меня нет проекта, я просто показал, как вызывать.
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
17.11.2017, 16:48  [ТС]
пишу в мэйне, выдает 2 ошибки:
C++ (Qt)
1
2
QVector<double> Perebor = {0, 1000000};
    QFuture<double> r = QtConcurrent::map(Perebor.begin(), Perebor.end(), w.StrategyCod1);
если написать
C++ (Qt)
1
2
QVector<double> Perebor = {0, 1000000};
    QFuture<void> r = QtConcurrent::map(Perebor.begin(), Perebor.end(), w.StrategyCod1);
то только одна ошибка.
что то не так.
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
17.11.2017, 18:22
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
double MainWindow::StrategyCod(double n)
{
    double d = 0.0;
    for (int a = 0; a < 2000000; ++a)
    {
        d += n * a;
        qDebug() << d;
    }
    return d;
}
Попробуйте внимательно прочитать документацию по QtConcurrent и посмотреть примеры. В КОЙ-ТО, ЧЁРТ ВАС ПОДЕРИ, ВЕКЕ!!!
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.11.2017, 19:08
Михаиллллллл, ты упорно ставишь double для индексов. В чём тут смысл?
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
17.11.2017, 19:34  [ТС]
Зачем вводить double d = 0.0; если нигде не использовать?
Документацию читал. И смотрел пример на оф. сайте(http://doc.qt.io/qt-5/qtconcur... n-cpp.html) и на других. Но пока свой вопрос не смог решить.
Функция такая
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
void MainWindow::StrategyCod1(double n)
{
    for (i = n; i <  1000000; ++i)
    {
        for (int a = 0; a < 2000000; ++a)
        {
            qDebug() << i * a;
        }
    }
}
В мэйне написано так
C++ (Qt)
1
2
 QVector<double> Perebor = {0, 1000000};
    QFuture<double> r = QtConcurrent::map(Perebor.begin(), Perebor.end(), w.StrategyCod1);
Хотя моя функция ничего не возвращает.
Если написать так, то ошибка остается только одна
C++ (Qt)
1
2
 QVector<double> Perebor = {0, 1000000};
    QFuture<void> r = QtConcurrent::map(Perebor.begin(), Perebor.end(), w.StrategyCod1);
Подскажите пожалуйста как запустить конкретно этот пример.
Может быть нужно что-то дописать в файл .pro . Сейчас он у меня такой:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
QT       += core gui
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
 
TARGET = MyCandleSrick
TEMPLATE = app
 
 
SOURCES += main.cpp\
        mainwindow.cpp \
    qcustomplot.cpp \
    strategycod.cpp
 
HEADERS  += mainwindow.h \
    qcustomplot.h
 
FORMS    += mainwindow.ui
CONFIG += c++11
Добавлено через 5 минут
Не выполнятся функция
C++ (Qt)
1
2
3
4
5
bool runIteration(Iterator it, int, void *) override
    {
        map(*it);
        return false;
    }
из
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef Q_QDOC
namespace QtConcurrent {
 
// map kernel, works with both parallel-for and parallel-while
template <typename Iterator, typename MapFunctor>
class MapKernel : public IterateKernel<Iterator, void>
{
    MapFunctor map;
public:
    typedef void ReturnType;
    MapKernel(Iterator begin, Iterator end, MapFunctor _map)
        : IterateKernel<Iterator, void>(begin, end), map(_map)
    { }
 
    bool runIteration(Iterator it, int, void *) override
    {
        map(*it);
        return false;
    }
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
17.11.2017, 19:37
Короче! Либо ты кидаешь нам деньги на покупку вангувия, дабы мы свои вангователи заправили, либо скопируешь нам сообщение ошибки.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.11.2017, 19:40
C++ (Qt)
1
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport concurent
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
18.11.2017, 17:57  [ТС]
Добавил. Но вылезает все та-же ошибка :C:\Qt\Qt5.9.2\5.9.2\mingw53_32\include\ QtConcurrent\qtconcurrentmapkernel.h:69: ошибка: no match for call to '(QtConcurrent::MemberFunctionWrapper1<v oid, MainWindow, double>) (double&)'
map(*it);
^
при
C++ (Qt)
1
 QFuture<void> r = QtConcurrent::map(Perebor.begin(), Perebor.end(), w.StrategyCod1);
а при
C++ (Qt)
1
QFuture<double> r = QtConcurrent::map(Perebor.begin(), Perebor.end(), w.StrategyCod1);
выдает 2 ошибки:
C:\Qt\project\MyCandleSrick\main.cpp:24: ошибка: conversion from 'QFuture<void>' to non-scalar type 'QFuture<double>' requested
QFuture<double> r = QtConcurrent::map(Perebor.begin(), Perebor.end(), w.StrategyCod1);
^
и
C:\Qt\Qt5.9.2\5.9.2\mingw53_32\include\Q tConcurrent\qtconcurrentmapkernel.h:69: ошибка: no match for call to '(QtConcurrent::MemberFunctionWrapper1<v oid, MainWindow, double>) (double&)'
map(*it);
^
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.11.2017, 20:50
Лучший ответ Сообщение было отмечено Михаиллллллл как решение

Решение

Сделай эту функцию static.
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
18.11.2017, 22:48
Или оберни в лямбду.
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
20.11.2017, 12:32  [ТС]
Сделал функцию статик:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
static void MainWindow::StrategyCod1(double n)
{
    for (i = n; i <  1000000; ++i)
    {
        for (int a = 0; a < 2000000; ++a)
        {
            qDebug() << i * a;
        }
    }
}
и вызвал мэп:
C++ (Qt)
1
QFuture<void> Perebor2 = QtConcurrent::map(w.Perebor.begin(), w.Perebor.end(), MainWindow::StrategyCod1);
выдает все те-же ошибки

Добавлено через 41 секунду
А лямбду не стоит использовать, т.к. функция будет большая, выйдет не удобно.

Добавлено через 47 минут
Добавил статик в хедер, скомптлтровалось. Спасибо
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
20.11.2017, 12:51
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Strateg {
    void CalcS(const double & d) { }
    static void sCalcS(const double & d) { }
    static double sCalcD(const double & d) { return d; }
};
 
void concurrent() {
    QList<double> a;
    Strateg s;
    QFuture<void> fur = QtConcurrent::map(a, Strateg::sCalcS);
    fur.waitForFinished();
    QFuture<void> furrr = QtConcurrent::map(a, [&s](const double& d){ s.CalcS(d); });
    furrr.waitForFinished();
    QFuture<double> furfur = QtConcurrent::mapped(a, Strateg::sCalcD);
    furfur.waitForFinished();
}
Assembler
1
2
16:46:27: Процесс «C:\Qt\Tools\mingw530_32\bin\mingw32-make.exe» завершился успешно.
16:46:27: Прошло времени: 00:07.
Что я сделал не так?
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
20.11.2017, 13:53  [ТС]
если в одном файле срр объявлять функцию, то ее можно делать не статичной(как я понял, если объявлять ее вне класса). Если ее объявлять в хедере в классе, то нужно делать статичной, и она может использовать только статичные переменные.
Вот мой пример
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <QVector>
#include <QTextStream>
#include <QStringList>
#include <iostream>
#include <QtConcurrent/QtConcurrent>
 
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    statick void StrategyCod(double);//код стратегии
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.11.2017, 13:53

Исправить ошибку в вычислениях функции
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include &lt;math.h&gt; #include&lt;stdlib.h&gt; #include&lt;iostream.h&gt; long double factorial(int n) { ...

Гармонический анализ функции - ошибка в вычислениях
Выходит вот такая ошибка, как ее решить?

Ошибка в вычислениях, вызов ассемблерной функции из С кода
Есть несложное выражение. X = K - B/2 + D + E*4; K - константа, D - трехбайтное число, В и Е - двухбайтовые. Проблема в том, что...

Организовать работу функции так, чтобы программа не дожидалась окончания её выполнения (многопоточность)
Всем привет. Только начинаю применять многопоточность. В нижеследующем коде нужно организовать таким образом, чтобы программа не дожидалась...

Рекурсия в вычислениях
Составить программу вычисления: \sum_{k=1}^{n}{(-1)}^{k}*k!!, где n!!=\begin{cases} &amp; 1*3*5*...*n,\text{ if } n = 2p + 1 \\ &amp;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru