私は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
}
このprocessDataMessages
はslot
に呼び出された前駆体として
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
の操作と、私が見逃しているダムそのおそらく何かの間に失われています。
'msg'は' dataReceived'を呼び出す関数で破壊されると思います。 'waitForFinished'を使ってメインスレッドをブロックすることで、非同期動作を利用することはありません。 – m7913d
良い点は、 'waitForFinished'がメインスレッドをブロックすることは実際には起こりませんでした。うーん... – weblar83