我正在尝试使用QtConcurrent
同时运行一个函数,但我遇到了其中一个参数的问题。
作为前言,假设我有以下类和“接口”:
class DataMessage : public QObject {
Q_OBJECT
// ... fields and methods
};
class ITimeStampInfo {
public:
virtual QDateTime timestamp() const = 0;
};
Q_DECLARE_INTERFACE(ITimeStampInfo, "My.TimeStampInfo/1.0")
class IDataLengthInfo {
public:
virtual int dataLength() const = 0;
};
Q_DECLARE_INTERFACE(IDataLengthInfo, "My.IDataLengthInfo/1.0")
class DataMessage1 : public DataMessage, public ITimeStampInfo {
Q_OBJECT
Q_INTERFACES(ITimeStampInfo)
// other fields, etc
QDateTime timestamp() const;
};
class DataMessage2 : public DataMessage, public IDataLengthInfo {
Q_OBJECT
Q_INTERFACES(IDataLengthInfo)
// other fields
int dataLength() const;
};
一个名为processDataMessages
的类函数:
void MyClass::processDataMessages(DataMessage *msg) {
// Previous to this function being called, concrete `DataMessage`
// instances are created and passed by pointer into this function
// Determine the data in the message
IDataLengthInfo *dl = qobject_cast<IDataLengthInfo*>(msg);
if (dl) {
qDebug() << "Got a message with IDataLengthInfo";
}
ITimeStampInfo *ts = qobject_cast<ITimeStampInfo*>(msg);
if (ts) {
qDebug() << "Got a message with ITimeStampInfo";
}
// etc
}
在processDataMessages
中调用此slot
。在正常操作期间,此函数完美地工作,并且qDebug()
语句按预期执行,因为指针是正确的 - 例如,检查调试器中的指针类型会导致DataMessage1
类型,例如
我现在想要异步地运行这个函数,可能还有一些工作要做。如果我尝试使用插槽内的QtConcurrent::run
执行此功能,如下所示:
void MyClass::dataReceived(DataMessage *msg) {
// this->processDataMessages(msg);
QtConcurrent::run(this, &MyClass::processDataMessages, msg);
}
现在,当我在qobject_cast
函数中的第一个processDataMessages
行中断时,我可以看到msg
指针的类型为DataMessage
,而不是DataMessage1
{1}}或DataMessage2
类型。
在QtConcurrent::run
的操作过程中丢失了一些东西,这可能是我错过的一些愚蠢行为。
答案 0 :(得分:0)
好的,事实证明,以下代码有效:
QFuture<void> f = QtConcurrent::run(this, &MyClass::processDataMessages, msg);
// Wait for the function to finish
f.waitForFinished();
看起来真的与原版有什么不同,但返回值中的某些东西可能是维持状态?