Dimpik
@Dimpik

Как сделать задержку в Qt цикле, чтобы поток Ui не останавливался?

Мне нужно сделать задержку в коде во время цикла for, но чтобы поток Ui не останавливался (функция sleep не поможет). Макет того, как это должно выглядеть: внизу.

void View::viruspodMoving(QGraphicsItem *virus) {  // функция, не слот
    for(int y = vir.y; y < 501;){
            delay() // реализованная задержка
            y = y + 4;
            vir.y = vir.y + 4;
            virus->setPos(vir.x, y);
    }

    if(vir.y >= 500){
        deleteVirus(virus);
    }

}
  • Вопрос задан
  • 966 просмотров
Решения вопроса 1
GavriKos
@GavriKos
Вам нужно разделять это по потокам. Данные отдельно, юай отдельно.
Хотя судя по всему в на Qt пытаетесь делать игру, это делается если что совсем не так:
- реализуете некую функцию, назовем ее Update, и делаете так чтобы она вызывалась 60 раз в секунду (примерно)
- именно в этой функции делаете вывод графики
- именно в этой функции делаете перемещение, но без задержек, а с привязкой в частоте вызова функции (точнее к времени с предыдущего вызова)
- а вот с вводом интереснее - его надо обрабатывать отдельно и накопительно
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Вам выше ответили правильно, надо разделять по разным потокам. Но если, все же, хочется написать задержку в Ui потоке, то вот
void delay(int ms)
{
  QElapsedTimer et;
  et.start();
  while(true)
  {
    qApp->processEvents();
    if(et.elapsed() > ms) break;
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы