М
МишаDec. 8, 2017, 7:59 a.m.

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

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

Пытаюсь запустить функцию из динамической библиотеки в многих потоках. При этом закоментированная функция  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
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

14
Evgenii Legotckoi
  • Dec. 8, 2017, 8:02 a.m.

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

    М
    • Dec. 8, 2017, 8:07 a.m.

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

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

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

        Evgenii Legotckoi
        • Dec. 8, 2017, 8:12 a.m.

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

          М
          • Dec. 8, 2017, 8:19 a.m.

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

           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
          Видимо не верно записана лямбда функция. Не могли бы Вы мне помочь записать ее верно.
            М
            • Dec. 8, 2017, 8:45 a.m.

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

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

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

                М
                • Dec. 8, 2017, 8:56 a.m.

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

                  М
                  • Dec. 8, 2017, 9 a.m.

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

                  void StrategyCod3(double Parametr)
                  {
                      qDebug()<<"Library work2"<< Parametr;
                      MainWindow *w;
                      //w->NBar=200;
                      qDebug()<<"Library work2"<< Parametr<<w->NBar;
                  }
                    Evgenii Legotckoi
                    • Dec. 8, 2017, 9:05 a.m.

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

                    QFuture<void> Perebor2 = QtConcurrent::map(Perebor,[this](const double& d){ StrategyCod(d,this);});
                      М
                      • Dec. 8, 2017, 9:09 a.m.

                      В таком случае выдает ошибку (видимо потому что  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
                        • Dec. 8, 2017, 9:10 a.m.
                        QFuture<void> Perebor2 = QtConcurrent::map(Perebor,[this, &](const double& d){ StrategyCod(d,this);});
                          Evgenii Legotckoi
                          • Dec. 8, 2017, 9:10 a.m.
                          QFuture<void> Perebor2 = QtConcurrent::map(Perebor,[=](const double& d){ StrategyCod(d,this);});
                            М
                            • Dec. 8, 2017, 9:19 a.m.

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

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

                              Comments

                              Only authorized users can post comments.
                              Please, Log in or Sign up
                              AD

                              C ++ - Test 004. Pointers, Arrays and Loops

                              • Result:50points,
                              • Rating points-4
                              m

                              C ++ - Test 004. Pointers, Arrays and Loops

                              • Result:80points,
                              • Rating points4
                              m

                              C ++ - Test 004. Pointers, Arrays and Loops

                              • Result:20points,
                              • Rating points-10
                              Last comments
                              Evgenii Legotckoi
                              Evgenii LegotckoiNov. 1, 2024, 12:37 a.m.
                              Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                              A
                              ALO1ZEOct. 19, 2024, 6:19 p.m.
                              Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                              ИМ
                              Игорь МаксимовOct. 5, 2024, 5:51 p.m.
                              Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                              d
                              dblas5July 5, 2024, 9:02 p.m.
                              QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                              k
                              kmssrFeb. 9, 2024, 5:43 a.m.
                              Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                              Now discuss on the forum
                              Evgenii Legotckoi
                              Evgenii LegotckoiJune 25, 2024, 1:11 a.m.
                              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                              t
                              tonypeachey1Nov. 15, 2024, 5:04 p.m.
                              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                              NSProject
                              NSProjectJune 4, 2022, 1:49 p.m.
                              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                              9
                              9AnonimOct. 25, 2024, 7:10 p.m.
                              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                              Follow us in social networks