М
Миша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
                              • 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
                              Реализация навигации по разделам Спасибо Евгений!

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