C++ 如何在QT中使用互斥锁线程开始轮询?
我正在使用Ubuntu12.04和Qt版本4.8.3。 在Qt主窗口中,我设法打开我的设备,这部分代码正在工作。 现在,打开设备后,如果有卡,我需要等待。这意味着我必须使用轮询从卡中获取数据。但轮询必须是无限循环。轮询卡的到达和移除 示例:每20毫秒轮询一次卡到达,当检测到一张卡时,我需要每20毫秒切换轮询以移除卡。因此,当检测到卡到达或移除时,我的应用程序会发出Qt事件信号,以便另一个Qt线程现在可以继续读/写卡 我读过关于QThread、互斥锁等的文章,我有点困惑。 我有一个主窗口和一个工人类。在我的主窗口中,我编码为C++ 如何在QT中使用互斥锁线程开始轮询?,c++,multithreading,qt,signals-slots,polling,C++,Multithreading,Qt,Signals Slots,Polling,我正在使用Ubuntu12.04和Qt版本4.8.3。 在Qt主窗口中,我设法打开我的设备,这部分代码正在工作。 现在,打开设备后,如果有卡,我需要等待。这意味着我必须使用轮询从卡中获取数据。但轮询必须是无限循环。轮询卡的到达和移除 示例:每20毫秒轮询一次卡到达,当检测到一张卡时,我需要每20毫秒切换轮询以移除卡。因此,当检测到卡到达或移除时,我的应用程序会发出Qt事件信号,以便另一个Qt线程现在可以继续读/写卡 我读过关于QThread、互斥锁等的文章,我有点困惑。 我有一个主窗口和一个工人
// Open a reader (from my SDK)
cReader.open
//If the reader is open use;
thread = new QThread();
worker = new Worker();
worker->moveToThread(thread);
connect(worker,SIGNAL(??????),SLOT(?????);
connect(worker,SIGNAL(?????),SLOT(?????);
.........
首先,我必须使用connect for SIGNAL/SLOT并启动卡到达/移除轮询。如果检测到任何卡,我会向另一个线程发送信号,从卡中读取或写入卡
所以我不知道从哪里开始,也不知道如何调用信号/插槽?我需要帮助来填补这个空缺??????信号/插槽上方
编辑:我还需要由轮询线程和卡处理线程共享的互斥锁。这是因为如果打开卡轮询命令,我的mifare会话将无效
需要帮忙吗,
以您的cReader为例,向您致以亲切问候,使用保护对象:
// class member
QMutex m_mutex;
//...
QByteArray MyClass::safeReadSomeData()
{
m_mutex.lock();
QByteArray result = cReader.read();
m_mutex.unlock();
return result;
}
另见
线程之间进行通信和参数交换的常用方法是使用。例如:
thread = new QThread();
worker = new Worker();
worker->moveToThread(thread);
connect( thread, SIGNAL(started()), worker, SLOT(startMyWork()) );
connect( worker, SIGNAL(sigCardDetected()), someOtherObject, SLOT(onCardDetected()) );
thread->start();
//...
官方文件中的有用文章:
另外,我认为这个关于QThread的答案对您很有用:
p、 您确定需要使用两个不同的附加线程来检测和读取/写入吗?在您的cReader示例中,使用对象保护:
// class member
QMutex m_mutex;
//...
QByteArray MyClass::safeReadSomeData()
{
m_mutex.lock();
QByteArray result = cReader.read();
m_mutex.unlock();
return result;
}
另见
线程之间进行通信和参数交换的常用方法是使用。例如:
thread = new QThread();
worker = new Worker();
worker->moveToThread(thread);
connect( thread, SIGNAL(started()), worker, SLOT(startMyWork()) );
connect( worker, SIGNAL(sigCardDetected()), someOtherObject, SLOT(onCardDetected()) );
thread->start();
//...
官方文件中的有用文章:
另外,我认为这个关于QThread的答案对您很有用:
p、 s.您确定需要使用两个不同的附加线程来检测和读取/写入吗?它不是线程安全的(除非一个QObject
访问另一个QObject
中的数据,并且两者都属于同一个线程)
就互斥锁的使用而言,QMutexLocker
是您的朋友,我建议您使用它,而不是手动处理锁定/解锁
如果你重新阅读你的问题,你会注意到你大量使用间隔。我们如何处理时间间隔?使用QTimer
。以下是我的建议:
- 创建一个
和workerQTimer
QObject
- 将计时器的时间间隔设置为20ms或任何您希望它触发事件的时间间隔;间隔设置为0的计时器意味着它将尽快触发事件
- 将计时器连接到工作人员的插槽(检查卡是否已卸下等)
- 将对象的插槽/信号连接到用户界面的信号/插槽(使用
可以保护对两者内部数据的访问)或另一个QMutexLocker
(在工作线程所在的同一线程或不同线程中)QObject
- 将计时器和辅助线程移到
并启动线程QThread
QObject
或UI本身发出信号。此时,互斥锁开始发挥作用,除非您正在访问工作线程所在的同一线程中的QObject
的另一个实例
通过这样做,您可以添加任意数量的线程。我有一个UI,它有6个线程在后台运行,可以访问UI,也可以访问彼此,使用计时器时没有任何问题
编辑:
我已经开始使用QTimer
、QThread
和QObject
开发一个新的应用程序。应用程序不完整/有缺陷,但您可以看到QTimer
的工作原理。它不是线程安全的(除非一个QObject
访问另一个QObject
中的数据,并且两者都属于同一个线程)
就互斥锁的使用而言,QMutexLocker
是您的朋友,我建议您使用它,而不是手动处理锁定/解锁
如果你重新阅读你的问题,你会注意到你大量使用间隔。我们如何处理时间间隔?使用QTimer
。以下是我的建议:
- 创建一个
和workerQTimer
QObject
- 将计时器的时间间隔设置为20ms或任何您希望它触发事件的时间间隔;间隔设置为0的计时器意味着它将尽快触发事件
- 将计时器连接到工作人员的插槽(检查卡是否已卸下等)
- 将对象的插槽/信号连接到用户界面的信号/插槽(使用
可以保护对两者内部数据的访问)或另一个QMutexLocker
(在工作线程所在的同一线程或不同线程中)QObject
- 将计时器和辅助线程移到
并启动线程QThread
QObject
或UI本身发出信号。At t