gpt4 book ai didi

c++ - Qt shared_ptr 信号与 QThreadPool

转载 作者:行者123 更新时间:2023-11-28 05:01:01 25 4
gpt4 key购买 nike

我正在尝试处理大量的 csv 数据,因为它是成 block 的。如果我在没有线程的情况下运行 chunkprocess,应用程序不会崩溃。但是,一旦我添加到线程池中,应用程序就会崩溃并引发以下错误。 ChunkProcess run 仅发出(除此之外)信号 shared_ptr,它是 ChunkProcess 的私有(private)成员。在网上阅读文章后,我发现 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 的私有(private)部分)。这与 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>作为类型?
如果你不这样做,它将不会通过信号槽机制(因为你使用了自动连接类型)!

关于c++ - Qt shared_ptr 信号与 QThreadPool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45969457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com