线程删除

 前几天定位一个问题,发现是线程结束不当造成的内存泄漏。定位解决完成后,突然想起梁的这本书。我翻到他的关于线程的一段的描述:“当用_beginThread来创建,而用CloseHandle来关闭线程时,这时复制的全局结构就不会被释放了,这就有了内存的泄漏。……”对于这段描述其实是不全面的;如果在C++里面强行中止一段线程;线程中的临时对象也不会去调用自己的悉构函数来释放资源的,也就是说,强行中止一段线程不是一种安全的做法,真正好的做法不是用系统提供的API来结束线程,而是要用自己可控制的循环变量来调节线程,这才能构做到线程的安全中止。在c里面有一个叫做longjmp的API,如果在CPP函数体内调用此函数也会出现相同的漏洞。
在Qt中,删除文件可以通过异步线程来实现。使用QThread和QObject的子类来创建异步线程,然后在线程中执行删除文件的操作。 以下是实现异步删除文件的步骤: 1. 创建一个继承自QObject的子类,例如FileDeleter,用于执行删除文件的操作。 2. 在FileDeleter类中定义一个槽函数,例如deleteFile(),用于删除文件。 3. 在deleteFile()函数中使用QFile::remove()函数来删除文件。 4. 在主线程中创建一个QThread对象和FileDeleter对象。 5. 将FileDeleter对象移动到新创建的QThread线程中,使用QObject::moveToThread()函数。 6. 连接线程的started()信号和FileDeleter的deleteFile()槽函数,以启动文件删除操作。 7. 启动线程,使用QThread::start()函数。 8. 当文件删除完成后,通过信号和槽机制将结果返回给主线程。 下面是一个示例代码: ```cpp // FileDeleter.h #include <QObject> class FileDeleter : public QObject { Q_OBJECT public: explicit FileDeleter(QObject *parent = nullptr); public slots: void deleteFile(const QString &filePath); }; // FileDeleter.cpp #include "FileDeleter.h" #include <QFile> FileDeleter::FileDeleter(QObject *parent) : QObject(parent) { } void FileDeleter::deleteFile(const QString &filePath) { QFile::remove(filePath); } // 使用异步线程删除文件 QThread *thread = new QThread; FileDeleter *fileDeleter = new FileDeleter; fileDeleter->moveToThread(thread); QObject::connect(thread, &QThread::started, fileDeleter, [fileDeleter, filePath]() { fileDeleter->deleteFile(filePath); thread->quit(); }); QObject::connect(thread, &QThread::finished, fileDeleter, &QObject::deleteLater); thread->start(); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值