QThread: Destroyed while thread is still running

        最近做一个图像异步加载的功能,如果使用原生thread,需要处理子线程到主线程的通知刷新,以及当窗口销毁后后异常情况。

        一个很简单的小模块,随便写了以下几行代码。

class LoadPixmapThread : public QThread
{
	Q_OBJECT
public:
	LoadPixmapThread(const QString& imagePath, const std::vector<QVariant>& params,  QObject *parent = nullptr) : QThread(parent), params(params), imagePath(imagePath) {};
private:
	std::vector<QVariant> params;
	QString imagePath;
	void run() final
	{
		auto loadedImageData = std::make_shared<QPixmap>(imagePath);;
		emit imageLoaded(imagePath, loadedImageData, params);
	}
signals:
	void imageLoaded(const QString&, std::shared_ptr<QPixmap>, const std::vector<QVariant>&);
};

        本以为很简单,但是在实际使用中,如果点击很快,线程的父对象已经销毁,但线程还在运行中,就会报错:QThread: Destroyed while thread is still running

        这就过分了,本来使用QThread就是想规避这个问题,结果依旧会发生,搜了半天,csdn的解决方案真的五花八门,有的说是把QThread对象声明成静态或全局的?有的说把QThread对象声明成变量?其实很简单,在线程的析构函数里面,加上以下代码即可:

	~LoadPixmapThread() override {
		quit();
		wait(); 
	};

附上完整代码:

class LoadPixmapThread : public QThread
{
	Q_OBJECT
public:
	LoadPixmapThread(const QString& imagePath, const std::vector<QVariant>& params,  QObject *parent = nullptr) : QThread(parent), params(params), imagePath(imagePath) {};
	~LoadPixmapThread() override {
		quit();
		wait(); 
	};
private:
	std::vector<QVariant> params;
	QString imagePath;
	void run() final
	{
		auto loadedImageData = std::make_shared<QPixmap>(imagePath);;
		emit imageLoaded(imagePath, loadedImageData, params);
	}
signals:
	void imageLoaded(const QString&, std::shared_ptr<QPixmap>, const std::vector<QVariant>&);
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值