М
Миша8 декабря 2017 г. 7:59

Ошибки при многопоточном запуске функции библиотке

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

Пытаюсь запустить функцию из динамической библиотеки в многих потоках. При этом закоментированная функция  Perebor1 (находится в классе) в аналогичной многопоточности работает хорошо. Но функция  Perebor2 (находится в библиотеке)  не хочет работать в многопоточности. При дебаге выдает ошибку сегментации (фото ошибки приложил). Дебаг выдает в консоль 7 раз:
RTTI symbol not found for class 'QtConcurrent::MapKernel<double*, MainWindow::on_ButtonRunMulti_clicked()::{lambda(double const&)#1}>'
Код моего вызова:
for (double i=d1;i<=d2;i=i+d3) //задание  значений стратегии
       {
           Perebor.append(i);
       }
       //QFuture<void> Perebor1 = QtConcurrent::map(Perebor,[this](const double& d){ StrategyCod2(d);});  //просчет стратегии в нескольхих потоках

       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);});  //просчет стратегии в нескольхих потоках
       //MyLib.unload();//отключение библиотеки
   }

 

 

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

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

14
Evgenii Legotckoi
  • 8 декабря 2017 г. 8:02

Вопрос на засыпку. Без MainWindow работает? Можете хоть что-то посчитать или сделать и вернуть результат?

    М
    • 8 декабря 2017 г. 8:07

    Если вызываю функцию в одном потоке, то работает, может менять переменные класса.

    При многопоточном вызове ничего не делает, ничего не возвращает .моя функция :
    qDebug()<<"Library work2"<< Parametr<<w->NBar;
      М
      • 8 декабря 2017 г. 8:10

      Сделал такую же функцию без MainWindow, так же не работает

        Evgenii Legotckoi
        • 8 декабря 2017 г. 8:12

        А вот теперь, дебагер вам в помощь. Ищите, где падает.

          М
          • 8 декабря 2017 г. 8:19

          Выдает ссылку на

           map(*it);
          что находится в
          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;
              }
          что в qtconcurrentmapkernel.h
          Видимо не верно записана лямбда функция. Не могли бы Вы мне помочь записать ее верно.
            М
            • 8 декабря 2017 г. 8:45

            А если вызывать без лямбда функции, то работает

            QFuture<void> Perebor2 = QtConcurrent::map(Perebor,StrategyCod);
            В выходит ошибка точно в лямбде-функции.
            Вы не знаете, как ее правильно написать?
              Evgenii Legotckoi
              • 8 декабря 2017 г. 8:52

              А зачем вам тогда лямбда, если заработало?

                М
                • 8 декабря 2017 г. 8:56

                Так ведь у меня 2 параметра. Один переменная перебора, 2-й ссылка на класс. Или может быть я могу сделать ссылку на класс в самой функции?

                  М
                  • 8 декабря 2017 г. 9:00

                  Если сделать так ссылку, то будет ссылка на новый объект класса, а не на уже используемый.

                  void StrategyCod3(double Parametr)
                  {
                      qDebug()<<"Library work2"<< Parametr;
                      MainWindow *w;
                      //w->NBar=200;
                      qDebug()<<"Library work2"<< Parametr<<w->NBar;
                  }
                    Evgenii Legotckoi
                    • 8 декабря 2017 г. 9:05

                    Перепишите так

                    QFuture<void> Perebor2 = QtConcurrent::map(Perebor,[this](const double& d){ StrategyCod(d,this);});
                      М
                      • 8 декабря 2017 г. 9:09

                      В таком случае выдает ошибку (видимо потому что  StrategyCod не метод класса):

                      C:\Qt\project\MyCandleSrick\mainwindow.cpp:975: ошибка: 'StrategyCod' is not captured
                      QFuture<void> Perebor2 = QtConcurrent::map(Perebor,[this](const double& d){ StrategyCod(d,this);});

                        Evgenii Legotckoi
                        • 8 декабря 2017 г. 9:10
                        QFuture<void> Perebor2 = QtConcurrent::map(Perebor,[this, &](const double& d){ StrategyCod(d,this);});
                          Evgenii Legotckoi
                          • 8 декабря 2017 г. 9:10
                          QFuture<void> Perebor2 = QtConcurrent::map(Perebor,[=](const double& d){ StrategyCod(d,this);});
                            М
                            • 8 декабря 2017 г. 9:19

                            Большое спасибо, так заработало

                            QFuture<void> Perebor2 = QtConcurrent::map(Perebor,[=](const double& d){ StrategyCod(d,this);});

                              Комментарии

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

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

                              • Результат:70баллов,
                              • Очки рейтинга1
                              РК

                              Qt - Тест 001. Сигналы и слоты

                              • Результат:84баллов,
                              • Очки рейтинга4
                              ВМ

                              C++ - Тест 001. Первая программа и типы данных

                              • Результат:80баллов,
                              • Очки рейтинга4
                              Последние комментарии
                              d
                              dblas55 июля 2024 г. 17:02
                              QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                              k
                              kmssr9 февраля 2024 г. 0:43
                              Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                              АК
                              Анатолий Кононенко5 февраля 2024 г. 7:50
                              Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                              EVA
                              EVA25 декабря 2023 г. 16:30
                              Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                              J
                              JonnyJo25 декабря 2023 г. 14:38
                              Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                              Сейчас обсуждают на форуме
                              BlinCT
                              BlinCT25 июня 2024 г. 7:00
                              Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                              Evgenii Legotckoi
                              Evgenii Legotckoi24 июня 2024 г. 21:11
                              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                              BlinCT
                              BlinCT5 мая 2024 г. 11:46
                              Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                              Evgenii Legotckoi
                              Evgenii Legotckoi2 мая 2024 г. 20:07
                              Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
                              IscanderChe
                              IscanderChe30 апреля 2024 г. 10:22
                              Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

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