私は、コピーせずに一部のワーカースレッドからクライアントに結果データを渡す方法について考えています。 Workerは他のスレッドで動作し、BigDataはQObjectを継承します。私の考えはデータの所有権を変更することです:QThread結果データをMainThreadに渡します
class Worker: public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = 0): QObject(parent);
signals:
void resultReady(BigData *data);
public slots:
void doWork() {
BigData *data = new BigData(this); // alloc new Data
while (!dataReady) {
... // appending data
}
// Data ready
// clearing ownership
data->setParent(NULL); // data can't be moved to another thread with parent
data->moveToThread(NULL);
emit resultReady(data);
}
};
void MainWindow::handleResult(BigData *data)
{
if (currentData_) {
delete currentData_;
}
data->setParent(this); // set new ownership
// works only if data's thread is NULL
data->moveToThread(QApplication::instance()->thread());
currentData_ = data;
}
いいですか?それとももっと適切な方法がありますか?
'BigData'クラスが' QObject'を継承する理由はありますか?それはそれ自身のシグナル/スロットを持っていますか? – Mike
いいえ、私はちょうどQObjectを使用しています。それは、親破壊の自動破壊BigDataが便利だからです。 – Sorcerer