首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QtConcurrent::运行传递指针问题

QtConcurrent::运行传递指针问题
EN

Stack Overflow用户
提问于 2017-09-21 23:11:47
回答 1查看 574关注 0票数 0

我试图使用QtConcurrent并发运行一个函数,但我遇到了其中一个参数的问题。

作为前身,假设我有以下类和“接口”:

代码语言:javascript
复制
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的类函数

代码语言:javascript
复制
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
}

processDataMessagesslot中调用。在正常操作期间,此函数可以正常工作,并且只要指针正确,qDebug()语句就会按预期执行-例如,在调试器中检查指针类型会产生DataMessage1类型

我现在想异步运行这个函数,因为可能会有一些工作要做。如果我尝试从插槽中使用QtConcurrent::run执行这个函数,如下所示:

代码语言:javascript
复制
void MyClass::dataReceived(DataMessage *msg) {
    // this->processDataMessages(msg);
    QtConcurrent::run(this, &MyClass::processDataMessages, msg);
}

现在,当我在processDataMessages函数的第一个qobject_cast行中断时,我可以看到msg指针的类型是DataMessage,而不是DataMessage1DataMessage2类型。

QtConcurrent::run的操作过程中丢失了一些东西,我可能遗漏了一些愚蠢的东西。

EN

回答 1

Stack Overflow用户

发布于 2017-09-21 23:33:05

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

代码语言:javascript
复制
QFuture<void> f = QtConcurrent::run(this, &MyClass::processDataMessages, msg);
// Wait for the function to finish
f.waitForFinished();

看起来与原始文件没有什么不同,但返回值中的某些内容可能是维护状态??

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46347496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档