簡體   English   中英

如何在QT中使用互斥鎖鎖定線程開始輪詢?

[英]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會話無效。

如有任何幫助,

QMutex的示例中,使用QMutex保護對象:

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

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

    return result;    
}

另請參見QMutexLockerQReadWriteLock

線程之間的通信和參數交換的常用方法是使用信號和插槽 例:

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
  • 將計時器的間隔設置為20ms或您希望其觸發事件的任何間隔; 時間間隔設置為0的計時器表示將盡快觸發一個事件
  • 將計時器連接到工作人員的插槽上(檢查卡是否已取出等)
  • 將對象的插槽/信號連接到UI的信號/插槽(使用QMutexLocker將使您能夠保護對兩者的內部數據的訪問)或另一個QObject (在工人所在的相同或不同線程中)
  • 將計時器和工作器都移至QThread並啟動線程

計時器將開始每X毫秒觸發一次對您卡的檢查。 然后,工作程序將從計時器接收該信號(此處不需要互斥,因為計時器和工作程序都具有相同的線程親和力)。 事情將在內部為工作人員更改,然后它將向另一個QObject或UI本身發出信號。 此時,除非您在工作線程所在的同一線程中訪問QObject另一個實例,否則互斥鎖才起作用。

您可以根據需要添加任意多個線程。 我有一個UI,該UI具有6個在后台運行的線程,可以同時訪問UI和彼此,而使用計時器沒有任何問題。

編輯:我已經開始使用QTimerQThreadQObject進行小型演示 應用程序不完整/混亂,但是您可以看到QTimer工作方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM