2015-04-17 90 views
0

我想創建一個使用Qt和MercuryAPI(native-c)的RFID閱讀器線程。它有一個native-c線程,但它有問題。我決定寫一個我自己的。QThread自定義事件

到目前爲止,我有用自定義事件(TagReadEvent)發送數據的線程。它植入下列qDebug錯誤:

QCoreApplication::removePostedEvent: Internal error: 0xbfdfed8 1001 is posted

我無法找到任何叫QCoreApplication::removePostedEvent,但下降這個錯誤時postEventList.size() == 0

TagReadEvent:

class TagReadEvent : public QEvent 
{ 
public: 
    TagReadEvent(); 
    ~TagReadEvent(); 
    QList<TMR_TagData> tagData; 
}; 

自定義事件處理程序:

void MainWindow::customEvent(QEvent *event) 
{ 
    if (event->type() == (QEvent::User + 1)) { 
     TagReadEvent *tagEvent = static_cast<TagReadEvent *>(event); 
     for (int i = 0; i < tagEvent->tagData.length(); ++i) { 
      TMR_TagData tagData = tagEvent->tagData.at(i); 
      char epcStr[128]; 
      TMR_bytesToHex(tagData.epc, tagData.epcByteCount, epcStr); 
      qDebug() << epcStr; 
     } 
    } 
    return QMainWindow::customEvent(event); 
} 

灌裝和發送事件:

TagReadEvent event; 
    while (TMR_SUCCESS == TMR_hasMoreTags(&(mainWindow->reader))) { 
     TMR_TagReadData trd; 
     lastStatus = TMR_getNextTag(&(mainWindow->reader), &trd); 
     if (checkerr(tr("fetching tag"))) 
      return; 
     event.tagData.append(trd.tag); 
    } 
    if (event.tagData.length() > 0) 
     QCoreApplication::postEvent(mainWindow,&event); 

回答

1

你應該在堆中分配的情況下,而不是作爲一個局部變量:

TagReadEvent * event = new TagReadEvent; 

它將被在目標線程中運行的事件循環銷燬和釋放。

從文檔: QCoreApplication::postEvent:

添加的事件的事件,與對象接收器作爲事件的接收機中,以一個事件隊列並立即返回。

的事件必須在堆上自事件後的隊列分配將採取事件的所有權,並刪除它,一旦它已經形成。在發佈後訪問活動並不安全。(強調我的)