簡體   English   中英

Qt shared_ptr信號與QThreadPool

[英]Qt shared_ptr signal with QThreadPool

我正在嘗試處理大csv數據,因為它是成塊的。 如果我在沒有線程的情況下運行chunkprocess,則應用程序不會崩潰。 但是,一旦我添加了線程池,應用程序就會崩潰並引發以下錯誤。 ChunkProcess運行僅發出(什么都沒有)信號shared_ptr,它是ChunkProcess的私有成員。 在在線閱讀文章之后,我發現shared_ptr不是線程安全的,除非您對其進行復制...所以有辦法在將其用作信號時對其進行復制嗎?

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";
}
ASSERT: "!d->ref.isShared()" in file tools\qlist.cpp, line 162

這意味着QListData (QList的私有部分)中的斷言失敗。 這與shared_ptr不相關。 Qt來源並沒有闡明此斷言所檢查的內容,但我猜測您在QList上進行了非法操作,或者您有某種競爭條件。 由於您沒有顯示代碼的相關部分,因此很難說。

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

這意味着您的QObject (很可能是ChunkProcessor )已從另一個線程中銷毀,並且該對象正在運行活動計時器。

假設這是ChunkProcessor問題,您可以通過以下幾種方式修復它:

  1. 不要在ChunkProcessor使用計時器
  2. 不要將ChunkProcessor所有權ChunkProcessor到胎面池( autoDelete()應該返回false

注意崩潰與shared_ptr無關!

還有一個問題是您是否將std::shared_ptr<customClass::ProcessedData>為類型?
如果不是這樣,它將不會通過信號插槽機制(因為您使用了自動連接類型)!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM