将Task添加到TaskQueue中,然后....,没啥好说的,直接上代码。
Task.h
#ifndef TASK_H
#define TASK_H
class QHTask
{
public:
QHTask(int count);
~QHTask();
void DoSomething();
private:
int m_count;
};
#endif // TASK_H
Task.cpp
#include "Task.h"
#include <iostream>
QHTask::QHTask(int count)
{
m_count = count;
}
QHTask::~QHTask()
{
}
void QHTask::DoSomething()
{
m_count++;
std::cout << "Task count: " << m_count << std::endl;
}
TaskQueue.h
#ifndef TASKQUEUE_H
#define TASKQUEUE_H
#include "Task.h"
#include <queue>
#include <mutex>
#include <thread>
class QHTaskQueue
{
public:
QHTaskQueue();
~QHTaskQueue();
public:
bool Push(QHTask *task);
QHTask *Pop();
bool Start();
void Stop();
private:
void Run();
private:
std::queue<QHTask*> m_taskQueue;
std::thread m_thread;
std::mutex m_mutex;
bool m_stoped;
};
#endif // TASKQUEUE_H
TaskQueue.cpp
#include "TaskQueue.h"
#include <iostream>
QHTaskQueue::QHTaskQueue()
: m_stoped(true)
{
}
QHTaskQueue::~QHTaskQueue()
{
}
bool QHTaskQueue::Push(QHTask *task)
{
if (task == nullptr)
{
return false;
}
m_mutex.lock();
m_taskQueue.push(task);
m_mutex.unlock();
return true;
}
QHTask *QHTaskQueue::Pop()
{
QHTask *task = nullptr;
m_mutex.lock();
if (!m_taskQueue.empty())
{
task = m_taskQueue.front();
m_taskQueue.pop();
}
m_mutex.unlock();
return task;
}
bool QHTaskQueue::Start()
{
if (!m_stoped)
{
return false;
}
m_stoped = false;
m_thread = std::thread(&QHTaskQueue::Run, this);
return true;
}
void QHTaskQueue::Stop()
{
m_stoped = true;
m_thread.join();
}
void QHTaskQueue::Run()
{
while (!m_stoped)
{
if (!m_taskQueue.empty())
{
QHTask *task = m_taskQueue.front();
task->DoSomething();
m_taskQueue.pop();
delete task;
}
}
}
main.cpp
#include "TaskQueue.h"
void MyTask(QHTaskQueue *taskQueue)
{
for (int i = 0; i < 10; i++)
{
QHTask *task = new QHTask(i + 1);
taskQueue->Push(task);
}
}
int main()
{
QHTaskQueue *taskQueue = new QHTaskQueue();
taskQueue->Start();
std::thread th(&MyTask, taskQueue);
if (th.joinable())
{
th.join();
}
system("pause");
return 0;
}
原文链接:C++实现的任务队列-CSDN博客