[英]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
問題,您可以通過以下幾種方式修復它:
ChunkProcessor
使用計時器 ChunkProcessor
所有權ChunkProcessor
到胎面池( autoDelete()
應該返回false
) 注意崩潰與shared_ptr
無關!
還有一個問題是您是否將std::shared_ptr<customClass::ProcessedData>
為類型?
如果不是這樣,它將不會通過信號插槽機制(因為您使用了自動連接類型)!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.