2017-08-30 17 views
0

大容量のcsvデータをチャンクに変換して処理しようとしています。スレッド処理なしでchunkprocessを実行すると、アプリケーションはクラッシュしません。ただし、スレッドプールに追加するとすぐに、アプリケーションがクラッシュし、次のエラーがスローされます。 ChunkProcessは、ChunkProcessのプライベートメンバーであるshared_ptrを送信します(それ以外は何も送信しません)。記事をオンラインで読むと、shared_ptrはスレッドのコピーを作成しない限りスレッドセーフではないことがわかりました。それで、シグナルとして使用している間にそのコピーを作成する方法はありますか?Qt shared_ptr signal with QThreadPool

ASSERT: "!d->ref.isShared()" in file tools\qlist.cpp, line 162 
Invalid parameter passed to C runtime function. 
Invalid parameter passed to C runtime function. 
QObject::~QObject: Timers cannot be stopped from another thread 

void MainWindow::parseCSV(QString file_name) 
{ 
    QFile file(file_name); 
    if (!file.open(QIODevice::ReadOnly)) 
     return; 
    QThreadPool *threadPool = QThreadPool::globalInstance(); 
    QList<QList<QByteArray>>* data = new QList<QList<QByteArray>>; 
    int count = 0; 
    while (!file.atEnd()) { 
     ++count; 
     QByteArray line = file.readLine(); 
     data->append(line.split(',')); 
     if (count > 10000) { 
      ChunkProcessor* chunkprocess = new ChunkProcessor(data); 

      connect(chunkprocess, 
        SIGNAL(finished(std::shared_ptr<customClass::ProcessedData>)), 
        this, 
        SLOT(readingFinished(std::shared_ptr<customClass::ProcessedData>))); 
//   threadPool->start(chunkprocess); 
//   threadPool->waitForDone(); 
      chunkprocess->run(); 
      delete data; 
      data = new QList<QList<QByteArray>>; 
      count = 0; 
     } 
    } 
    delete data; 
} 

void MainWindow::readingFinished(std::shared_ptr<customClass::ProcessedData> data) 
{ 
    emittedData.append(data); 
    qInfo()<<"got to finish reading"; 
} 
+1

QListをヒープに割り当てるのはなぜですか?スタックに作成してください! –

+0

あなたの提案をありがとう、私は間違いなく私はスレッドプロセスを把握して変更します。 – ntmt

答えて

1
ASSERT: "!d->ref.isShared()" in file tools\qlist.cpp, line 162 

これは、アサーションがQListData(QListののプライベートの部分)に失敗したことを意味します。これはshared_ptrとは関係ありません。 Qt sourceは、このアサーションがチェックする内容を明確にしていませんが、私はあなたがQListで何か違法行為をしていると推測しています。 コードの関連部分を表示していないので、伝えるのは難しいです。

QObject::~QObject: Timers cannot be stopped from another thread 

この

はあなた QObject(おそらく ChunkProcessor)は、別のスレッドから破壊されていることを意味し、このオブジェクトは、アクティブなタイマーを実行しています。これはあなたがカップルの方法でそれを修正することができ ChunkProcessorに問題があると仮定すると

  1. ChunkProcessor
  2. 内のタイマーを使用していないトレッドプールにChunkProcessorの所有権を移転しない(autoDelete()falseを返す必要があります)

注:クラッシュはshared_ptrと関連していません。

また、タイプとしてstd::shared_ptr<customClass::ProcessedData>を登録しましたか?
あなたがそうしなかったなら、シグナルスロット機構を通らないでしょう(あなたは自動接続タイプを使用しています)!

+0

ありがとうございました.ChunkProcessorのautoDeleteを "false"に設定してください。私はshared_ptrをすでに登録しています.1回の実行では動作しますが、スレッド実行では動作しません。とにかく、autoDelete()の提案に感謝します。 – ntmt

関連する問題