当前位置: 首页 > article >正文

QGraphicsView实现简易地图7『异步加载-多瓦片-无底图』

前文链接:QGraphicsView实现简易地图6『异步加载-单瓦片-无底图』
前一篇文章提到的异步单瓦片加载,是指线程每准备好一个瓦片数据后,立刻抛出信号让主线程加载。而本篇异步多瓦片加载是指线程准备好所有瓦片数据后,一起抛出信号让主线程加载瓦片。两者都是多线程加载瓦片,都能够保证地图的流畅性,区别仅仅是加载地图呈现的效果不同而已。本片文章将提供瓦片缓存类的源码,供大家参考。
1、动态演示效果

2、静态展示图片
在这里插入图片描述
缓存类代码

#pragma once

/*
 * 瓦片缓存
 */

#include <QList>

template<class Key, class T>
class TileItemCache : public QHash<Key, T>
{
public:
	inline void setMaxCost(int maxCost) {
		if (size() > maxCost) {
			int count = size() - maxCost;
			for (int i = 0; i < count; ++i) {
				dequeue();
			}
		}
		
		m_maxCost = maxCost;
	}

	int maxCost() { return m_maxCost; }

	T first() {
		return m_keys.size() ? value(m_keys[0]) : (std::is_pointer_v<T> ? (new std::remove_pointer_t<T>()) : T());
	}

	inline void enqueue(const Key &k, const T &t) {
		if (size() >= m_maxCost) {
			auto it = find(k);
			if (it != end()) {
				dequeue();
			}
		} else {
			insert(k, t);
			m_keys.append(k);
		}	
	}

	inline void dequeue() {
		if (m_keys.size() == 0)
			return;

		Key k = m_keys.takeFirst();
		T item = take(k);
		delete item;
		item = nullptr;
	}

	T take(const Key &key) {
		m_keys.removeOne(key);
		return QHash::take(key);
	}

	inline QList<Key> keys() const { return QHash<Key, T>::keys(); }
	
	inline QList<T> values() const { return QHash<Key, T>::values(); }

	void clear() {
		qDeleteAll(begin(), end());
		QHash<Key, T>::clear();
		m_keys.clear();
	}

private:
	int m_maxCost = 0;
	QList<Key> m_keys;
};

http://www.kler.cn/a/160112.html

相关文章:

  • Go开发指南- Goroutine
  • C++ 判断语句的深入解析
  • ES6字符串的新增方法
  • 用友U8-Cloud uapbd.refdef.query sql注入漏洞复现
  • llama factory lora 微调 qwen2.5 7B Instruct模型
  • 微澜:用 OceanBase 搭建基于知识图谱的实时资讯流的应用实践
  • Linux--程序地址空间
  • 慎用!3个容易被打的Python恶搞脚本
  • Java中的并发编程:深入理解CountDownLatch
  • 从零开始学习 JavaScript APl(七):实例解析关于京东案例头部案例和放大镜效果!
  • 跳水比赛(C++)
  • 使用sqoop操作HDFS与MySQL之间的数据互传
  • Hello World
  • redis中使用pipeline
  • Qt Rsa 加解密方法使用(pkcs1, pkcs8, 以及文件存储和内存存储密钥)
  • 对于多台232modbus仪表低成本通讯的modbus转profinet网关
  • 微服务开发:断路器详解
  • 卡码网语言基础课 | 20. 排队取奶茶
  • Vue的methods中定时器的变量报错问题
  • 十年JK无人知!一朝泳衣天下识
  • 【数据结构】——二叉树特点
  • 区块链创新应用场景不断拓展,实现去中心化
  • 前端三大MV*模式:MVC、mvvm、mvp模式介绍
  • 数据库的设计规范
  • Element-UI 动态控制输入组件类型,定义代码组件、前端模板
  • 02数仓平台Zookeeper