Временная задержка между последовательными лучевыми отливками - PullRequest
2 голосов
/ 23 сентября 2019

В качестве продолжения для этого поста я создал проект Qt3D , который является модифицированной версией примера Qt3D .Я запускаю свой проект с Qt 5.13.1 на openSUSE Linux с GCC-7.В моем проекте я могу использовать задержку между последовательными приведениями лучей.Я сделал несколько неожиданных наблюдений:


В файле main.cpp, когда я запускаю эту строку, приведение лучей застревает в некоторой точке и не может продолжаться:

ConsecutiveRayCaster *consecutiveRayCaster = new ConsecutiveRayCaster(scene, TimeDelayStatus::NoDelay);

Однако,Когда я запускаю эту строку, даже если для временной задержки установлено значение 0 msec, все последовательные преобразования лучей выполняются без каких-либо проблем:

ConsecutiveRayCaster *consecutiveRayCaster = new ConsecutiveRayCaster(scene, TimeDelayStatus::SomeDelay, 0 /* milliseconds */);

Этот переключатель имеет значение:

switch (m_timeDelayStatus) {
case NoDelay:
    rayCaster->trigger(origin, direction, length);
    break;
case SomeDelay:
    QTimer::singleShot(m_timeDelayBetweenRayCasts, [rayCaster, origin, direction, length](){ rayCaster->trigger(origin, direction, length); });
    break;
    }

Интересно, почему?

1 Ответ

2 голосов
/ 23 сентября 2019

Причина различного поведения заключается в том, как вызывается функция trigger().В первом случае (без задержки) выполнение ожидает выхода из функции trigger().Однако во втором случае вызов функции запланирован для выполнения, и функция QTimer::singleShot() выходит почти сразу, не дожидаясь возврата вызова функции trigger().

...