М
Миша11 декабря 2017 г. 8:30

Диалоговое окно прогресса QProgressDialog

QProgressDialog

Здравствуйте.

Хочу отобразить прогресс вычисления, проводящихся в многопоточном режиме. Но при работе программа вылетает. Скажите пожалуйста, как исправить?
for (double i=d1;i<=d2;i=i+d3) //задание  значений стратегии
{
     Perebor.append(i);
}
QProgressDialog* ProgresMulti = new QProgressDialog("Просчет стратегий...", "&Cancel", 0, Perebor.size());
ProgresMulti->setMinimumDuration(0);
ProgresMulti->setWindowTitle("Прогресc");
QLibrary MyLib("C:\\Qt\\project\\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\\debug\\StrategyCod");  //путь к библиотеке
MyLib.unload();//отключение библиотеки
MyLib.load();//чтение
typedef void (*MyPrototype)(double,MainWindow *);
MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
QFuture<void> Perebor2 = QtConcurrent::map(Perebor,[=](const double& d){ StrategyCod(d,this);
ProgresMulti->setValue((d*Perebor.size())/(Perebor.end()-Perebor.begin())) ;
//qApp->processEvents();
if (ProgresMulti->wasCanceled())
{
     //break;
}
});

 

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

10
М
  • 11 декабря 2017 г. 8:31
 ProgresMulti->setValue(Perebor.size()) ;
       delete ProgresMulti;
    Evgenii Legotckoi
    • 11 декабря 2017 г. 8:43
    День добрый
    Здесь нужно использовать QFutureWatcher, который будет наблюдать за прогрессом выполнения вашей стратегии.

    В общем пример может выглядеть следующим образом.
    QProgressDialog dialog;
    
    // Создать объект QFutureWatcher и подключить сигналы и слоты к диалогу.
    // Мониторинга прогресса изменений для future
    QFutureWatcher<void> futureWatcher;
    connect(&futureWatcher, &QFutureWatcher::finished, &dialog, &QProgressDialog::reset);
    connect(&dialog;, &QProgressDialog::canceled, &futureWatcher, &QFutureWatcher::cancel);
    connect(&futureWatcher, &QFutureWatcher::progressRangeChanged, &dialog, &QProgressDialog::setRange);
    connect(&futureWatcher, &QFutureWatcher::progressValueChanged, &dialog, &QProgressDialog::setValue);
    
    // Запуск вычислений
    futureWatcher.setFuture(QtConcurrent::map(vector, spin));
    
    // Показать диалог и запустить программную петлю диалога
    dialog.exec();
    
    futureWatcher.waitForFinished();
      М
      • 11 декабря 2017 г. 9:52

      но оно не компилируется

        Evgenii Legotckoi
        • 11 декабря 2017 г. 9:56
        • (ред.)
        но оно не компилируется
        Вообще ни о чём не говорит. Я вам привёл это в качестве обобщённого примера, а не в качестве прямого руководства к действию в стиле копипасты.

        Ошибки какие?
          М
          • 11 декабря 2017 г. 10:04
          C:\Qt\project\MyCandleSrick\mainwindow.cpp:1006: ошибка: 'template<class T> class QFutureWatcher' used without template parameters
          connect(&futureWatcher, &QFutureWatcher::finished, &dialog, &QProgressDialog::reset);
          ^
          C:\Qt\project\MyCandleSrick\mainwindow.cpp:1007: ошибка: 'template<class T> class QFutureWatcher' used without template parameters
          connect(&dialog, &QProgressDialog::canceled, &futureWatcher, &QFutureWatcher::cancel);
          ^
          C:\Qt\project\MyCandleSrick\mainwindow.cpp:1008: ошибка: 'template<class T> class QFutureWatcher' used without template parameters
          connect(&futureWatcher, &QFutureWatcher::progressRangeChanged, &dialog, &QProgressDialog::setRange);
          ^
          C:\Qt\project\MyCandleSrick\mainwindow.cpp:1009: ошибка: 'template<class T> class QFutureWatcher' used without template parameters
          connect(&futureWatcher, &QFutureWatcher::progressValueChanged, &dialog, &QProgressDialog::setValue);
          ^

            М
            • 11 декабря 2017 г. 10:14

            Еще думал это сделать с помощью ProgressBar

            QFuture<void> Perebor2 = QtConcurrent::map(Perebor,[=](const double& d){ StrategyCod(d,this);
                   ui->ProgressBar->setValue(55);
                   });
            Но при таком варианте приложение тоже вырубается. Может быть вы знаете почему?
              Evgenii Legotckoi
              • 11 декабря 2017 г. 10:15

              Да скорее всего небезопасная конкуренция с доступом к объекту. Насчёт ошибок, потом гляну, что там с шаблонными аргументами, возможно что-то и забыл.

                М
                • 11 декабря 2017 г. 10:18

                Спасибо, буду ждать.

                  Evgenii Legotckoi
                  • 11 декабря 2017 г. 11:14
                  • (ред.)

                  Вот рабочий пример

                  void Widget::on_pushButton_clicked()
                  {
                      QProgressDialog dialog;
                  
                      // Создать объект QFutureWatcher и подключить сигналы и слоты к диалогу.
                      // Мониторинг прогресса изменений для future
                      QFutureWatcher<void> futureWatcher;
                      connect(&futureWatcher, &QFutureWatcher<void>::finished, &dialog, &QProgressDialog::reset);
                      connect(&dialog, &QProgressDialog::canceled, &futureWatcher, &QFutureWatcher<void>::cancel);
                      connect(&futureWatcher, &QFutureWatcher<void>::progressRangeChanged, &dialog, &QProgressDialog::setRange);
                      connect(&futureWatcher, &QFutureWatcher<void>::progressValueChanged, &dialog, &QProgressDialog::setValue);
                  
                      QVector<int> vector;
                      // Запуск вычислений
                      futureWatcher.setFuture(QtConcurrent::map(vector, [](const int& i){ qDebug() << i; }));
                  
                      // Показать диалог и запустить программную петлю диалога
                      dialog.exec();
                  
                      futureWatcher.waitForFinished();
                  }
                    М
                    • 12 декабря 2017 г. 0:41

                    При таком варианте скорость расчетов резко падает и прогоняется несколько раз одно и тоже.

                    Если убрать dialog.exec(); то расчет идет с нормальной скоростью  только один раз, но окошка прогресса нет.

                      Комментарии

                      Только авторизованные пользователи могут публиковать комментарии.
                      Пожалуйста, авторизуйтесь или зарегистрируйтесь
                      AD

                      C++ - Тест 004. Указатели, Массивы и Циклы

                      • Результат:50баллов,
                      • Очки рейтинга-4
                      m
                      • molni99
                      • 26 октября 2024 г. 8:37

                      C++ - Тест 004. Указатели, Массивы и Циклы

                      • Результат:80баллов,
                      • Очки рейтинга4
                      m
                      • molni99
                      • 26 октября 2024 г. 8:29

                      C++ - Тест 004. Указатели, Массивы и Циклы

                      • Результат:20баллов,
                      • Очки рейтинга-10
                      Последние комментарии
                      i
                      innorwall12 ноября 2024 г. 5:12
                      Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
                      i
                      innorwall12 ноября 2024 г. 1:23
                      QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
                      i
                      innorwall11 ноября 2024 г. 22:50
                      Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
                      i
                      innorwall11 ноября 2024 г. 21:19
                      Алгоритм сортировки кучей The role of raloxifene in preventing breast cancer priligy precio
                      i
                      innorwall11 ноября 2024 г. 20:55
                      PyQt5 - Урок 006. Работа с QTableWidget buy priligy 60 mg 53 have been reported by Javanovic Santa et al
                      Сейчас обсуждают на форуме
                      i
                      innorwall12 ноября 2024 г. 3:56
                      добавить qlineseries в функции buy priligy senior brother Chu He, whom he had known for many years
                      i
                      innorwall11 ноября 2024 г. 17:55
                      Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                      9
                      9Anonim25 октября 2024 г. 16:10
                      Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                      ИМ
                      Игорь Максимов3 октября 2024 г. 11:05
                      Реализация навигации по разделам Спасибо Евгений!

                      Следите за нами в социальных сетях