【发布时间】:2022-01-21 03:47:09
【问题描述】:
我正在阅读 this 和 this 文档。 但是我对多线程仍然很陌生,我无法完全理解这些主题。
Ubuntu 20.04 下的 Qt 6.2.0。 基本上我有这个功能:
bool Flow::checkNfc()
{
QByteArray id;
QByteArray data;
bool ret = _nfc.read(&id, &data, 8);
if (ret)
{
// do something
}
return ret;
}
它试图读取一个 NFC 标签,如果找到它,就会做一些事情。 这个函数:
bool ret = _nfc.read(&id, &data, 8);
依次调用一些阻塞当前线程的libnfc 函数。
我只需要在另一个线程中执行这个函数,以避免我的应用程序“卡顿”。
因为checkNfc 和_nfc.read 函数都需要与主线程交换数据,我不确定是否可以使用QFutureWatcher 方法。我试过类似的东西:
QFutureWatcher<bool> watcher;
QFuture<bool> future = QtConcurrent::run(&MyProject::checkNfc);
watcher.setFuture(bool);
但是它返回了一个很长的编译错误列表,我猜这是一个非常错误的方法。
所以我想试试QThread 解决方案。问题是示例对于真实案例场景来说太简单了:
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork(const QString ¶meter) {
QString result;
/* ... here is the expensive or blocking operation ... */
emit resultReady(result);
}
signals:
void resultReady(const QString &result);
};
无论如何我都试过了,在我的主要课程中我写道:
private:
QThread _nfcThread;
MyNfc _nfc;
private slots:
void nfc_readResult(bool success, QByteArray id, QByteArray data);
在构造函数中:
_nfc.moveToThread(&_nfcThread);
connect(&_nfcThread, &QThread::finished, &_nfc, &QObject::deleteLater);
connect(&_nfc, &MyNfc::resultRead, this, &MyProject::nfc_readResult);
_nfcThread.start();
从一个计时器槽:
_nfc.doWork();
在 MyNfc 中:
signals:
void resultRead(bool result, QByteArray id, QByteArray data);
public slots:
void doWork();
和:
void MyNfc::doWork()
{
QByteArray id;
QByteArray data;
bool ret = read(&id, &data, 8);
emit resultRead(ret, id, data);
}
一切仍在工作...但每次我调用 doWork() 时,我的主应用程序仍然阻塞。
我错过了什么?
【问题讨论】:
标签: multithreading qt qthread qt6