我想使用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);
答案 0 :(得分:1)
您应该在堆上分配事件,而不是局部变量:
TagReadEvent * event = new TagReadEvent;
它将被目标线程中运行的事件循环销毁和解除分配。
来自文档:
QCoreApplication::postEvent:
将事件事件(对象接收者作为事件的接收者)添加到事件队列并立即返回。
事件必须在堆上分配 ,因为事件后事件队列将获取事件的所有权并在发布后将其删除。在发布事件后访问该事件是不安全的。(强调我的)