QThread自定义事件

时间:2015-04-17 08:58:12

标签: c++ multithreading qt

我想使用Qt和MercuryAPI(native-c)创建RFID阅读器线程。它有一个native-c线程,但它有问题。我决定自己写一个。

到目前为止,我已经使用自定义事件(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 个答案:

答案 0 :(得分:1)

您应该在堆上分配事件,而不是局部变量:

TagReadEvent * event = new TagReadEvent;

它将被目标线程中运行的事件循环销毁和解除分配。

来自文档: QCoreApplication::postEvent:

将事件事件(对象接收者作为事件的接收者)添加到事件队列并立即返回。

事件必须在堆上分配 ,因为事件后事件队列将获取事件的所有权并在发布后将其删除。在发布事件后访问该事件是不安全的。(强调我的)