[英]How do I start polling with mutex locked thread in QT?
我正在使用Qt版本4.8.3的Ubuntu 12.04。 在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進行SIGNAL / SLOT並開始卡到達/移除輪詢。 比起檢測到任何卡,我有信號通知另一個線程從卡中讀取或寫入卡中。
所以我不知道從哪里開始或如何調用信號/插槽? 我需要幫助來填補?????? 高於信號/插槽。
編輯:我還需要由輪詢線程和卡處理線程共享的互斥鎖。 這是因為打開卡查詢命令會使我的mifare會話無效。
如有任何幫助,
// class member
QMutex m_mutex;
//...
QByteArray MyClass::safeReadSomeData()
{
m_mutex.lock();
QByteArray result = cReader.read();
m_mutex.unlock();
return result;
}
另請參見QMutexLocker , QReadWriteLock 。
線程之間的通信和參數交換的常用方法是使用信號和插槽 。 例:
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();
//...
官方文檔中的有用文章: 線程和QObjects
我也認為有關QThread
答案將對您有用: https : //stackoverflow.com/a/35056527/4149835
ps是否確定需要使用兩個不同的附加線程進行檢測和讀取/寫入?
它不是線程安全的(除非一個QObject
訪問另一個QObject
數據並且它們都屬於同一線程)。
就互斥鎖的使用而言, QMutexLocker
是您的朋友,我建議您使用它而不是手動處理鎖定/解鎖。
如果重新閱讀您的問題,您會發現自己大量使用間隔。 以及我們如何處理間隔? 使用QTimer
。 這是我的建議:
QObject
一起創建QTimer
QMutexLocker
將使您能夠保護對兩者的內部數據的訪問)或另一個QObject
(在工人所在的相同或不同線程中) QThread
並啟動線程 計時器將開始每X毫秒觸發一次對您卡的檢查。 然后,工作程序將從計時器接收該信號(此處不需要互斥,因為計時器和工作程序都具有相同的線程親和力)。 事情將在內部為工作人員更改,然后它將向另一個QObject
或UI本身發出信號。 此時,除非您在工作線程所在的同一線程中訪問QObject
另一個實例,否則互斥鎖才起作用。
您可以根據需要添加任意多個線程。 我有一個UI,該UI具有6個在后台運行的線程,可以同時訪問UI和彼此,而使用計時器沒有任何問題。
編輯:我已經開始使用QTimer
, QThread
和QObject
進行小型演示 。 應用程序不完整/混亂,但是您可以看到QTimer
工作方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.