2015-04-17 93 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:

添加的事件的事件,与对象接收器作为事件的接收机中,以一个事件队列并立即返回。

的事件必须在堆上自事件后的队列分配将采取事件的所有权,并删除它,一旦它已经形成。在发布后访问活动并不安全。(强调我的)