gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:06:43 25 4
gpt4 key购买 nike

我使用的是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com