我正在开发一个应用程序(c++
),它利用多种类型的硬件同时收集各种类型的数据。常见的使用模式是在它们自己的线程中运行这些设备的不同接口(眼睛跟踪,运动跟踪,可视化等),因此它们尽可能少地相互混淆。我不需要保证线程实际执行时的超精确定时,我理解这需要硬件定时器。但是,我要做的是让线程能够查询某种中央计时器,他们可以定期使用它来为收集的数据添加时间戳,这样数据就可以(半精确地)对齐稍后进行分析。毫秒级精度可以用于此目的。
该应用程序使用Qt
用于gui目的,因此我认为QElapsedTimer将是一个潜在的解决方案。但是,文档声明所有方法都是reentrant,而不是线程安全的。我是否正确,这需要为每个希望使用此类计时功能的线程提供唯一的QElapsedTimer
对象?如果是这种情况,我的方法是要求每个线程在阻塞函数中初始化时序(在主线程中执行)。初始化将涉及创建一个包装器对象,该对象组合了一个定时器+来自“主”定时器的偏移量,以便创建的任何/所有定时器都与主计时器“同步”。这将在主线程中完成,以便从非线程安全的原始计时器获得偏移量。
这是一种合理的方法,还是我应该使用更好的“标准”(设计模式)方法?或者,是否有一个不同的图书馆更适合我的目的?目前我正在使用Windows(7和XP),但该应用程序最终将被定位为跨平台。
答案 0 :(得分:2)
在Qt中,您可以使用QMutexLocker等方便的类进行同步调用。因此,您可以将QMutexLocker与QMutex一起使用以将该函数标记为线程安全,然后您可以跨线程使用QElapsedTimer而不会出现任何问题。
答案 1 :(得分:1)
可重入意味着如果要同时访问,则每个线程至少需要一个不同的实例。您也可以使用QDateTime生成时间戳,但这也不是线程安全的。因此,我认为互斥对该方法的访问会更好。