М
Миша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);});

                              Комментарии

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

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

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

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

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

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

                              • Результат:20баллов,
                              • Очки рейтинга-10
                              Последние комментарии
                              ИМ
                              Игорь Максимов22 ноября 2024 г. 8:51
                              Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                              Evgenii Legotckoi
                              Evgenii Legotckoi31 октября 2024 г. 11:37
                              Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                              A
                              ALO1ZE19 октября 2024 г. 5:19
                              Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                              ИМ
                              Игорь Максимов5 октября 2024 г. 4:51
                              Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                              d
                              dblas55 июля 2024 г. 8:02
                              QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                              Сейчас обсуждают на форуме
                              Evgenii Legotckoi
                              Evgenii Legotckoi24 июня 2024 г. 12:11
                              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                              t
                              tonypeachey115 ноября 2024 г. 3:04
                              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                              NSProject
                              NSProject4 июня 2022 г. 0:49
                              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                              9
                              9Anonim25 октября 2024 г. 6:10
                              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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