队列(Queue)是一种遵循先进先出(FIFO,First In First Out)原则的线性数据结构。在这种结构中,元素的添加(入队)和移除(出队)操作分别在队列的尾部和头部进行。这种特性使得队列在处理一些需要按顺序执行任务的场景中表现出优越性。
使用场景:
任务队列:可以用 QQueue 来管理一个任务队列,将待处理的任务添加到队列中,然后依次处理并移除已完成的任务。这种场景下,可以将 QQueue 当作一个先进先出(FIFO)数据结构来使用。
消息队列:在多线程应用中,可以使用 QQueue 存储线程间通信的消息。主线程将消息添加到队列中,子线程从队列中取出消息并处理。这种场景下,需要确保对队列的访问是线程安全的,可以通过加锁等机制实现。
数据缓冲:在处理大量数据时,可以使用 QQueue 作为缓冲区,存储已经处理过的数据,以便在需要时能够快速访问。例如,在处理实时音频或视频数据时,可以将已处理的数据帧存入 QQueue 中,以备后续的播放或分析使用。
enqueue() 队列的入队
dequeue() 队列的出队
优点:
动态扩展:QQueue 会根据需要动态地调整内存分配,能够有效地管理内存资源。
高效的随机访问:由于基于 QList 实现,QQueue 可以在常数时间内完成随机访问操作。
与其他 Qt 容器兼容:QQueue 可以与其他 Qt 容器类(如 QList、QVector 等)方便地进行互操作,提高代码的通用性和可重用性。
缺点:
性能受限:对于大量连续数据操作,QQueue 的性能可能不如 QVector 或其他基于数组的容器,尤其是在内存分配和数据拷贝方面。
非线程安全:QQueue 本身并不是线程安全的。如果需要在多线程环境中使用 QQueue,开发者需要自行添加同步机制以保证线程安全。
不适合大规模数据存储:由于 QQueue 是基于 QList 实现的,当数据量非常大时,可能会导致内存碎片问题。在这种情况下,使用 QVector 或 QLinkedList 可能是更好的选择。
实例:
1、创建一个任务类
#include "channel.h"
enum {
TESTING_A, //任务类型A
TESTING_B,
TESTING_C,
};
class Task : public QObject
{
Q_OBJECT
public:
Task(int type, int timeout, QList<QVariant>input, Channel* pChannel, QObject *parent = nullptr);
virtual ~Task();
int type;
int timeout;
Channel* pChannel;
QList<QVariant> input;
QList<QVariant> output;
bool result