任务队列
<h1>任务队列设计文档</h1>
<p>由于程序使用了一些脱管的方法, 或者比较多的第三方库调用等, 所以需要设计一个任务队列, 来委托完成这些稍微复杂的操作,
通过任务队列代理完成任务, 这样便可将业务功能统一模块化, 解决各种解耦合的问题.</p>
<h2>任务队列管理模块</h2>
<p>通过添加一个全局单例管理模块, 进行所有任务的管理, 该管理模块具有以下特点:</p>
<ul>
<li><strong>全局单例</strong></li>
<li><strong>线程安全</strong></li>
<li><strong>支持定时任务</strong>
(runTask可以指定启动任务的时间戳,默认0则立即执行)</li>
<li><strong>支持超时中止</strong>
(runTask可以指定任务等待最长时间单位ms, 默认0则永久等待)</li>
<li><strong>支持同步/异步队列</strong>
(在runTask的时候通过参数来决定使用同步队列或者异步队列)</li>
<li><strong>结果回调</strong>
(在init时指定回调信号及方法)</li>
</ul>
<p>具体实现类(含伪代码)为:</p>
<pre><code>// 需要派生自QObject, 才能使用信号槽消息与外界通信
class MeetTaskQueue : QThread
{
public:
static MeetTaskQueue* getInstance();
// 初始化Queue, 每当有任务执行完成/中止时, 发送该信号给目标对象接收处理
void init(Q_SIGNAL cb);
// 通过任务对象创建新的任务
void runTask(IMeetTask* t);
// 如果这里指定了优先级,则会覆盖掉t中相关的值
void runTask(IMeetTask* t, int priority, int timeout=0);
// 在这个线程函数中管理任务队列, lstTask_, lstTaskSync_组列表
virtual void run()override;
// 中止所有任务, 并回调所有任务中的onFail方法.
void cancelAll();
private:
QThreadPool threadPool_;
std::list<IMeetTask*> lstTask_; // 异步执行的任务队列
QThreadPool threadPoolSin_;
std::list<IMeetTask*> lstTaskSync_; // 同步阻塞执行的任务队列(threadPoolSin_ 的max_count为1)
std::mutex mtx_;
}</code></pre>
<h2>任务对象</h2>
<p>所有可以运行的任务需要派生自IMeetTask接口, 该接口派生自QRunnable, 以便可以多线程同时调度这些任务
//另外该接口定义了几个虚函数: onSuccess, onFail(含cancel, timeout 等), 如果需要处理, 则重载该方法.
//注意, 以上方法回调以后, 然后再发送信号给主线程的消息处理方法, 并将onSuccess, onFail返回的值一并回调给主线程的信号槽中.</p>
<p>具体实现类(含伪代码)为:</p>
<pre><code>class IMeetTask : QRunnable
{
public:
// 初始化任务, 参数1=优先级,0为最小(如为-1则为同步执行), 参数2=任务超时时间, 如果超时,则回调onTimeout
void init(int priority=0, int timeout=0);
// 如果不使用主回调, 也可以自定回调方法
void setCallback(Q_SIGNAL cb);
// 重写这个runable关在其中执行任务相关逻辑, 该方法由MeetTaskQueue中的线程池负责调度
void run()override;
//virtual int onSuccess() {return 0;}
//virtual int onFail(eccode e) {return (int)e;}
}</code></pre>