#multithreading #qt #qt4 #locking
#многопоточность #qt #qt4 #блокировка
Вопрос:
Мне нужно реализовать критический раздел в Qt (4.7.3, Windows XP).
Например, общедоступный слот:
void MyClass::myPublicSlot(...local params...)
{
...
block of code working with global params;
...
}
Функция void myPublicSlot
запускается по таймеру.
Выполнение функции может занять много времени, иногда больше, чем тиканье таймера (или, например, нажатие кнопки).
Необходимо заблокировать block of code working with global params
.
Вызов функции может быть как многопоточным, так и однопоточным.
P.S. Я пробовал использовать QMutex и QMutexLocker, но это приводит к взаимоблокировке в однопоточном случае.
Комментарии:
1. Является ли ваша функция рекурсивной? Затем вам нужно использовать рекурсивный QMutex. В противном случае вы как-то неправильно поняли семантику вашей программы.
Ответ №1:
QMutex
это то, что вы хотите. Возможно, вы используете его рекурсивно, но не создаете рекурсивный мьютекс? Это единственное объяснение взаимоблокировки в однопоточном коде.
Комментарии:
1. Функция не является рекурсивной. Но он содержит qApp-> processEvent(), которые позволяют запускать его больше раз.
2. Спасибо! Это работает: <код> … приватный: > изменяемый QMutex* мьютекс; … </code> <код> … //! Обработчик нажатия кнопки аннулирует MainWindow::on_pushButton_clicked() { QMutexLocker locker(мьютекс); Q_UNUSED(locker); qDebug() << «Start»; qint64 t = QDateTime::currentMSecsSinceEpoch(); // подождите 10 секунд для (int i = 0; i < 10; i) { while (QDateTime:: currentMSecsSinceEpoch() — t < (i 1)*100) qApp->processEvents(QEventLoop::AllEvents, 90); qDebug() << i; } qDebug() << «Остановить»; } … </code>