c++ - 如何在 QT 中使用互斥锁定线程开始轮询?

标签 c++ multithreading qt signals-slots polling

我使用的是 Ubuntu 12.04 和 Qt 版本 4.8.3。 在 Qt 主窗口中,我设法打开了我的设备,这部分代码正在运行。 现在,在我打开设备后,如果有卡,我需要等待。这意味着我必须使用轮询从卡中获取数据。但是轮询必须是无限循环的。轮询卡的到达和移除。

每 20 毫秒轮询卡片到达的示例,当检测到卡片时,我需要每 20 毫秒切换轮询以移除卡片。因此,当检测到卡片到达或移除时,我的应用程序会发出 Qt 事件信号,这样另一个 Qt 线程现在可以继续读/写卡片。

我读到有关 QThread、互斥锁等的信息,但我有点困惑。 我有一个主窗口和一个 worker 类(Class)。在我的主窗口中,我编码为;

// 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(?????);
.........

首先,我必须使用 SIGNAL/SLOT 连接并启动卡到达/移除轮询。如果检测到任何卡,我会向另一个线程发送信号以从卡中读取或写入卡。

所以我不知道从哪里开始或如何调用信号/插槽?我需要帮助来填写 ??????在信号/插槽之上。

已编辑:我还需要轮询线程和卡片处理线程共享互斥锁。这是因为如果打开卡轮询命令将使我的 mifare session 无效。

任何帮助,请 亲切的问候,

最佳答案

使用 QMutex为了保护一个对象,以你的 cReader 为例:

// class member
QMutex m_mutex;
//...

QByteArray MyClass::safeReadSomeData()
{
    m_mutex.lock();
    QByteArray result = cReader.read();
    m_mutex.unlock();

    return result;    
}

另见 QMutexLocker , QReadWriteLock .

线程间通信和参数交换的常用方法是使用 signals & slots .示例:

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();
//...

来自官方文档的有用文章:Threads and QObjects

此外,我认为这个关于 QThread 的答案对您有用:https://stackoverflow.com/a/35056527/4149835

附注您确定需要使用两个不同的附加线程来检测和读写吗?

关于c++ - 如何在 QT 中使用互斥锁定线程开始轮询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35291452/

相关文章:

c++ - 内存管理基础?

c++ - 带双引号的字符串初始化

c# - 线程安全事件调用

java - 在Java中,不使用静态或类变量的方法需要同步吗?

c# - 通过 Tasks C# 动态搜索中断

qt - 如何识别当前选项卡在 QTabWidget 中的更改时间?

c++ - CMake:使用相同的代码但包含不同的包含路径构建多个库

c++ - 为什么知道字节流中的字节是什么?

qt - 如何使用Qt QPainter绘制线性渐变弧?

qt - 无法在 QML 中播放视频