XMeet

Mediasoup视频会议


任务队列

<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&lt;IMeetTask*&gt; lstTask_; // 异步执行的任务队列 QThreadPool threadPoolSin_; std::list&lt;IMeetTask*&gt; 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>

页面列表

ITEM_HTML