Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在QT中使用互斥锁线程开始轮询?_C++_Multithreading_Qt_Signals Slots_Polling - Fatal编程技术网

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

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、互斥锁等的文章,我有点困惑。 我有一个主窗口和一个工人

我正在使用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
。以下是我的建议:

  • 创建一个
    QTimer
    和worker
    QObject
  • 将计时器的时间间隔设置为20ms或任何您希望它触发事件的时间间隔;间隔设置为0的计时器意味着它将尽快触发事件
  • 将计时器连接到工作人员的插槽(检查卡是否已卸下等)
  • 将对象的插槽/信号连接到用户界面的信号/插槽(使用
    QMutexLocker
    可以保护对两者内部数据的访问)或另一个
    QObject
    (在工作线程所在的同一线程或不同线程中)
  • 将计时器和辅助线程移到
    QThread
    并启动线程
计时器将开始每X毫秒触发一次卡检查。然后,工作线程将从计时器接收该信号(这里不需要互斥,因为计时器和工作线程具有相同的线程亲和力)。worker的内部情况将发生变化,然后它将向另一个
QObject
或UI本身发出信号。此时,互斥锁开始发挥作用,除非您正在访问工作线程所在的同一线程中的
QObject
的另一个实例

通过这样做,您可以添加任意数量的线程。我有一个UI,它有6个线程在后台运行,可以访问UI,也可以访问彼此,使用计时器时没有任何问题

编辑: 我已经开始使用
QTimer
QThread
QObject
开发一个新的应用程序。应用程序不完整/有缺陷,但您可以看到
QTimer
的工作原理。

它不是线程安全的(除非一个
QObject
访问另一个
QObject
中的数据,并且两者都属于同一个线程)

就互斥锁的使用而言,
QMutexLocker
是您的朋友,我建议您使用它,而不是手动处理锁定/解锁

如果你重新阅读你的问题,你会注意到你大量使用间隔。我们如何处理时间间隔?使用
QTimer
。以下是我的建议:

  • 创建一个
    QTimer
    和worker
    QObject
  • 将计时器的时间间隔设置为20ms或任何您希望它触发事件的时间间隔;间隔设置为0的计时器意味着它将尽快触发事件
  • 将计时器连接到工作人员的插槽(检查卡是否已卸下等)
  • 将对象的插槽/信号连接到用户界面的信号/插槽(使用
    QMutexLocker
    可以保护对两者内部数据的访问)或另一个
    QObject
    (在工作线程所在的同一线程或不同线程中)
  • 将计时器和辅助线程移到
    QThread
    并启动线程
计时器将开始每X毫秒触发一次卡检查。然后,工作线程将从计时器接收该信号(这里不需要互斥,因为计时器和工作线程具有相同的线程亲和力)。worker的内部情况将发生变化,然后它将向另一个
QObject
或UI本身发出信号。At t