М
Қар. 20, 2017, 6:03 Т.Қ.

Многопоточность. Ошибки при обращении к переменной

QtConcurrent, многопоточность

Здравствуйте.
У меня 4 ядра процессора.
Вызываю несколько потоков функции:

QFuture<void> Perebor2 = QtConcurrent::map(Perebor, StrategyCod);
Функция при старте обращается к 6 массивам основного класса. В каждом массиве около 2 млн элементов.
При многопоточном запуске появляется ошибка.
Скажите пожалуйста, как решить вопрос с запросом данных из одного места?
2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

6
Evgenii Legotckoi
  • Қар. 21, 2017, 1:37 Т.Ж.

С QtConcurent позже отвечу, запамятовал нюансы работы

    М
    • Қар. 21, 2017, 12:48 Т.Қ.

    Как оказалось, вылетает на MainWindow w;
    Если переношу QMutex Mutex; выше MainWindow w; тоже вылетает.

    void StrategyCod(double Parametr) //код стратегии 
    {    
        MainWindow w;     
        QMutex Mutex; //мьютекст для блокировки данных для многопоточности    
        Mutex.lock();     
        QVector<double> Open=w.Open;     
        Mutex.unlock();
    }
      Evgenii Legotckoi
      • Қар. 21, 2017, 2:32 Т.Қ.

      А зачем Вы каждый раз создаёте новый объект окна? Попробуйте сделать вашу задачу без класса, наследованного от QMainWindow. Вам нужно же только расчёты вынести в отдельный поток.

        М
        • Қар. 21, 2017, 2:41 Т.Қ.

        Просто нужные мне данные хранятся в классе MainWindow. Их оттуда можно вынести, но это затрата лишних ресурсов. Хочу сделать пооптимизированней.

          Evgenii Legotckoi
          • Қар. 21, 2017, 2:47 Т.Қ.

          Лучше вынести эти данные, такие классы работают в GUI потоке. Загрузку файлов, обработку и прочее делают отдельно от GUI потока Qt. Оптимизации ваш подход не даст... А если у Вас будет несколько потоков, то на каждый поток будет вызываться окно... забавная моргающая картинка из гирлянды окон будет.

            М
            • Қар. 21, 2017, 3:14 Т.Қ.
            • (өңделген)

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

            Но можно ли все таки выгружать данные из класса в потоки?

              Пікірлер

              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
              Кіріңіз немесе Тіркеліңіз