Программа оптимизации QT для выполнения вычислений через определенные промежутки времени (истек сигнал и время QTimer)
Привет у меня есть файл в следующем формате, где я пытаюсь вычислить местоположение самолета с радаров (приближающихся к аэропорту) каждые 10 мсек.
Position_X
Position_Y
заголовок
скорость
t1
t2 w1
T3 W2
t4
Где w1, w2 = скорость поворота
в этом случае {t1, t2, t3, t4} = 200 сек ~ 200000 мсек
и оценивая позицию после каждых 10 мсек
Вот как я обрабатываю:
// defined in Plane.h
QElapsedTimer t;
QTimer timer;
// Plane.cpp
Plane::Plane : timer() {
QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(computePosition()));
timer.start(10);
t.start();
}
void Plane::computePosition()
{
if (!t.hasExpired(t1)
{
//do
}
if (t.hasExpired(t2) || t.hasExpired(t3))
{
//do
}
if (t.hasExpired(t3) || t.hasExpired(t4))
{
// do
}
if (t.hasExpired(t5))
{
// do
}
if(t.hasExpired(t5 + 100))
timer.stop();
qDebug() << QDateTime::currentMSecsSinceEpoch()<< t.elapsed()
<< Position_X << Position_Y;
}
Я не могу сопоставить системное время с истекшим временем или условным временем. интервал таймера составляет 10 мс, но в отладке я вижу, что он варьируется от 15-40 секунд. А также время захода на посадку составляет 200 мс, но с использованием истекшего таймера для оценки положения выталкивает матрицу самолета из аэропорта.
Как мне убедиться, что моя программа работает с интервалами времени t1, t2, t3, t4 и t5 и что позиция оценена правильно.
Ценю любые идеи или помощь. Спасибо!
Расчет позиций не является проблемой. Я хочу выполнить вычисления в момент времени t1..t5 в сочетании с QTimer (интервал составляет 10 мс).
2 ответа
Прежде всего, вам не нужно использовать таймеры для выполнения вычислений: вы можете заранее все рассчитать, в расчетах используется переменная времени, которую не нужно привязывать к какому-либо таймеру. Это просто переменная, которую вы увеличиваете при выполнении шагов численного интегрирования. Вы должны сказать нам, почему вы думаете, что программа должна запускаться через определенные промежутки времени - потому что пока это просто ложь. Это даже не проблема Qt, это простые старые численные методы. Расчеты просты; за каждый временной шаг:
- Начать с
t=0
, - Обновите курс в соответствии с текущей скоростью поворота.
- Перевести радиальную скорость в декартовую скорость.
- Интегрируйте скорость в положение.
- Выберите скорость следующего хода, если текущая
t
прошлое даноt_i
, - инкремент
t
на 10 мс. - Повторите с № 2, если текущее время
t
прошло время окончания.
Вот и все. Вы можете свободно выбирать любое правило интеграции. t
это просто переменная. Это не имеет ничего общего с течением времени на компьютере, который вычисляет результаты.
Остальное зависит от того, что означает время t1
-t4
и какие выходы вы ищете - хотите ли вы историю времени от начальной позиции до некоторого времени t4+0.1s
или только 4 выхода - по одному на каждый раз t1
-t4
, так далее.
QTimer
Скорее всего, не сможет поддерживать строгие тики 10 мс. QElapsedTimer
может быть более точным, но это означает больше для измерения производительности функций, методов и т. д.
Если вы хотите смоделировать интервал X мс, просто установите QTimer
стрелять в определенный промежуток времени. Затем вы можете поддерживать счетчик, который увеличивается каждый раз, когда timeout
сигнал испускается. Оттуда вы можете рассчитать свое "смоделированное время", которое будет T = X * count
, Там нет необходимости для QElapsedTimer
совсем.
QTimer
не "трудно в режиме реального времени". Если вам абсолютно необходимо иметь в режиме реального времени, вам придется искать в другом месте.