gpt4 book ai didi

c++ - QThread自定义事件

转载 作者:行者123 更新时间:2023-11-28 06:18:49 24 4
gpt4 key购买 nike

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

到目前为止,我已经使用发送数据的自定义事件 (TagReadEvent) 编写了线程。它会丢弃以下 qDebug 错误:

QCoreApplication::removePostedEvent:内部错误:0xbfdfed8 1001 已发布

我找不到任何名为 QCoreApplication::removePostedEvent 的东西,但是当 postEventList.size() == 0 时会删除此错误。

标签读取事件:

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);

最佳答案

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

TagReadEvent * event = new TagReadEvent;

它将被目标线程中运行的事件循环销毁和释放。

来自文档: QCoreApplication::postEvent:

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

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

关于c++ - QThread自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29694680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com