Qt 多线程复制文件崩溃

王桑的一天 2020-08-18 11:33:12
我在生产者线程中遍历文件,把文件塞入队列,消费者从队列取文件路径进行复制、或剪切行为
用了 QSemaphore 来限制队列长度,达到阻塞的目的,起了8个消费者线程

这段代码复制是没问题,剪切(rename)就会崩溃,为什么?rename 是异步的吗?

报错的故障模块是
故障模块名称: msvcrt.dll


static QSemaphore freeSpace(8);
static QSemaphore usedSpace(0);
static QQueue<MoveInfo *> task_q;
// 消费者代码
void Consumer::run()
{
MoveInfo *info;
while(true)
{
usedSpace.acquire();
info = task_q.dequeue();
freeSpace.release();
if(info->src.isEmpty())
{
info->deleteLater();
break;
}

if(!QFileInfo(info->dst).exists())
{
if(info->remove)
{
bool b = QFile::rename(info->src, info->dst);
b = QFile::rename(info->src.replace(".sa", ".sc"), info->dst.replace(".sa", ".sc"));
} else {
QFile::copy(info->src, info->dst);
QFile::copy(info->src.replace(".sa", ".sc"), info->dst.replace(".sa", ".sc"));
}
}
info->deleteLater();
}
}
...全文
14772 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
踌伫 2020-08-29
  • 打赏
  • 举报
回复
我感觉整段代码都不是我喜欢的写法。 在你代码基础上是改不了了,要么我重新写一份? 您好好说说您的需求?
王桑的一天 2020-08-18
  • 打赏
  • 举报
回复
好像问题就出在删除上

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧