2017-09-21 3 views
0

私はQtConcurrentを使って同時に関数を実行しようとしていますが、引数の1つに問題があります。QtConcurrent :: run - ポインタを渡す問題

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 
} 

このprocessDataMessagesslotに呼び出された前駆体として

は、私は次のクラスと "インターフェース" を持っていると言うことができます。通常の操作では、この関数は完全に機能し、ポインタが正しい場合には qDebug()ステートメントが期待どおりに実行されます。たとえば、デバッガのポインタタイプを調べると、

のようになります。非同期的に潜在的に、行うべき仕事のビットがあるかもしれません。私はスロット内からQtConcurrent::runを使用してこの機能を実行しようとした場合、次のように:

void MyClass::dataReceived(DataMessage *msg) { 
    // this->processDataMessages(msg); 
    QtConcurrent::run(this, &MyClass::processDataMessages, msg); 
} 

を今、私はprocessDataMessages関数の最初のqobject_cast行に壊れたときに、私はmsgポインタは型であることが分かりますDataMessageありませんDataMessage1またはDataMessage2のいずれかのタイプです。

何かがQtConcurrent::runの操作と、私が見逃しているダムそのおそらく何かの間に失われています。

答えて

0

[OK]を、それは結局のところ、以下のコードが動作するよう:

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

が本当に任意の元に異なるようではありませんが、戻り値の何かが状態を維持することができます?

+0

'msg'は' dataReceived'を呼び出す関数で破壊されると思います。 'waitForFinished'を使ってメインスレッドをブロックすることで、非同期動作を利用することはありません。 – m7913d

+0

良い点は、 'waitForFinished'がメインスレッドをブロックすることは実際には起こりませんでした。うーん... – weblar83