Вызов QApplication :: processEvents () внутри цикла OpenMP? - PullRequest
1 голос
/ 28 января 2011

Приветствую всех,

В моем приложении QT я использую OpenMP для распараллеливания циклов. В цикле я хочу обновить значения индикатора выполнения текущего QMainWindow.Следующий фрагмент кода показывает, как я пытаюсь сделать это:

#ifdef OPENMP_ENABLE
#pragma omp parallel for
#endif

for (int i = 0; i < endIndex; i++) {
  getMainWindow()->setProgress(currProg); //change the value of QProgressBar
 QApplication::processEvents(); //update events,widgets

                  //Do some processing
 }

Здесь getMainWindow () -> SetProgress () метод просто изменить значения QProgressbar, прикрепленного к строке состояния QMainWindow.

При компиляции и запуске приложения с включенным OpenMP выдается следующая ошибка:

Ошибка ASSERT в QCoreApplication :: sendEvent: "Невозможно отправить события объектам, принадлежащим другомутекущий поток 161975a0. Получатель 'MainWindowClass' (типа 'MainWindow') создан в потоке 13d78f8 ", файл kernel \ qcoreapplication.cpp, строка 348

Любые советы, как вызвать QApplication ::processEvents () с OpenMP?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Подкласс QThread и поместите свою бизнес-логику туда и используйте OpenMP там. Используйте сигналы и слоты для обновления QProgressBar.

Вы можете вызывать методы GUI только в главном потоке GUI. Когда вы вызываете QApplication :: processEvents вне его, внутри потока OpenMP, вы нарушаете это правило.

0 голосов
/ 01 декабря 2012

Полагаю, должно работать и следующее:

#pragma omp parrallel for
for (int i = 0; i < endIndex; i++) 
{
  #pragma omp single
  {
    getMainWindow()->setProgress(currProg); //change the value of QProgressBar
    QApplication::processEvents(); //update events,widgets
  }
  // Do some processing
}
...