AcquisitionManager 是一个生活在线程中的 QObject,我使用它从采集 PCI-Express 卡中获取样本:
m_acquisitionThread = new QThread(this);
m_acquisitionManager = new AcquisitionManager();
m_acquisitionManager->moveToThread(m_acquisitionThread);
m_acquisitionThread->start();
在我的应用程序代码(位于主线程中)中,我使用这个:
QMetaObject::invokeMethod(m_acquisitionManager, "executeDataAcquisition", Qt::QueuedConnection);
启动数据采集。
在“executeDataAcquisition”插槽内,我有一个循环:
for (size_t i = 0; i < numberOfLoops; ++i)
{
// blocking calls...
}
有时,我希望用户尽快中止采集,我考虑使用从主线程修改的布尔变量(+ volatile)。即使这不是非常线程安全的,布尔变量也只能由“从”线程读取,并且只能由主线程(主线程)写入:
for (size_t i = 0; i < numberOfLoops && m_bKeepAcquiring; ++i)
{
// blocking calls...
}
这样做是否正确?我在我工作的很多软件中都看到了这种技术,但我不知道这样做是否安全。还有其他技术吗?