作为这篇文章的后续,我创建了一个Qt3D项目,它是Qt3D示例的修改版本。我正在使用带有GCC-7
的 openSUSE Linux 上的 Qt 5.13.1 运行我的项目。在我的项目中,我可以在连续光线投射之间使用时间延迟。我做了一些意想不到的观察:
在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;
}
我想知道为什么?
不同行为的原因在于如何调用trigger()
函数。在第一个情况下(无延迟(,执行会等到trigger()
函数退出。但是,在第二种情况下,函数调用被安排执行QTimer::singleShot()
函数几乎立即退出,而无需等待trigger()
函数调用返回。