QtConcurrent :: run - 传递指针问题

时间:2017-09-21 15:11:47

标签: multithreading qt qtconcurrent

我正在尝试使用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的操作过程中丢失了一些东西,这可能是我错过的一些愚蠢行为。

1 个答案:

答案 0 :(得分:0)

好的,事实证明,以下代码有效:

QFuture<void> f = QtConcurrent::run(this, &MyClass::processDataMessages, msg);
// Wait for the function to finish
f.waitForFinished();

看起来真的与原版有什么不同,但返回值中的某些东西可能是维持状态?