SOUI中TaskLoop组件介绍
SOUI是一套开源(MIT协议)的Windows平台下的DirectUI框架,它提供了大量的高效控件,也提供了很多扩展组件,目前已经持续维护近10年,在大量的项目中证明稳定可靠。
GIT地址:
国内:https://gitee.com/setoutsoft/soui
国外:https://github.com/soui2/soui
下面介绍一个最近增加的组件:TaskLoop.
TaskLoop是一个异步任务模块。对于有网络请求的情况,异步任务是常规需求。
和使用其它SOUI组件一样,要使用异步任务模块,先完成组件的编译,然后就可以通过SComMgr来创建TaskLoop对象。
打开soui.08.sln可以看到上面工程组织结构。使用其它版本VS的朋友,可以用build.bat来生成自己需要的VS版本。
我们先看一看staskloop-i.h中的接口定义。
#pragma once
#include <unknown/obj-ref-i.h> namespace SOUI
{
struct IRunnable
{
virtual ~IRunnable() {}
virtual IRunnable* clone() const = ;
virtual void run() = ;
virtual void *getObject() = ;
virtual const char *getClassInfo() const = ;
}; struct ITaskLoop : public IObjRef
{
enum Priority
{
High = ,
Normal = ,
Low = -,
}; virtual bool getName(char *pszBuf, int nBufLen) = ; /**
* Start a thread to run.
* @param priority the thread priority
*/
virtual void start(const char * pszName,Priority priority) = ; /**
* Stop thread synchronized.
*/
virtual void stop() = ; /**
* postTask post or send a tasks to this task manager.
* @param runnable the to be run task object.
* @param waitUntilDone, true for send and false for post.
* @param priority, the task priority.
* @return the task id, can be used by cancelTask.
*/
virtual long postTask(const IRunnable *runnable, bool waitUntilDone, int priority=) = ; /**
* Remove tasks for a specific object from task loop pending task list
* @param object the specific object wants pending functors to be removed
*/
virtual void cancelTasksForObject(void *object) = ; /**
* Cancel tasks for a specific task ID list
* @param taskList the task ID list to be canceled
* @return the removed task list.
*/
virtual bool cancelTask(long taskId) = ; /**
* get the total task number in the task loop queue.
* @return total task number in task loop queue
*/
virtual int getTaskCount() const = ; /**
* get the run loop status.
* @return the running status
*/
virtual bool isRunning() = ; /**
* get the running task info.
* @param buf, to receive task info buf.
* @param bufLen, buffer length
* @return false - no task is running; true - succeed.
*/
virtual bool getRunningTaskInfo(char *buf, int bufLen) = ;
};
}
创建出ITaskLoop接口后,先调用start来启动,再调用postTask来添加一个异步任务。添加到同一个TaskLoop对象中的任务顺序在同一个线程中执行。
任务的优先级默认是0,如果很多任务在排除,新加入的任务希望优先执行,则将nPriority这个参数设置为一个更大的值,任务插入队列的时候,自动根据nPriority排序,nPriority越大,排序越前。
postTask需要提供一个IRunnable对象来运行。
使用SOUI/helper/sfunctor.hpp可以方便的将一个对象的成员函数或者全局函数转换成为一个IRunnable对象。
下面看一下demo中如何使用ITaskLoop.
//演示异步任务。
class CAsyncTaskObj
{
public:
void task1(int a)
{
SLOG_INFO("task1,a:" << a);
} void task2(int a, const std::string & b)
{
SLOG_INFO("task2,a:" << a<<" b:"<<b.c_str());
}
}; int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR /*lpstrCmdLine*/, int /*nCmdShow*/)
{ //必须要调用OleInitialize来初始化运行环境
HRESULT hRes = OleInitialize(NULL);
SASSERT(SUCCEEDED(hRes)); //使用imgdecoder-png图片解码模块演示apng动画
SComMgr2 *pComMgr = new SComMgr2(_T("imgdecoder-png")); { //演示异步任务。
CAutoRefPtr<ITaskLoop> pTaskLoop;
if (pComMgr->CreateTaskLoop((IObjRef**)&pTaskLoop))
{
CAsyncTaskObj obj;
pTaskLoop->start("test", ITaskLoop::Low);
STaskHelper::post(pTaskLoop, &obj, &CAsyncTaskObj::task1, ,true);
STaskHelper::post(pTaskLoop, &obj, &CAsyncTaskObj::task2, ,"abc", true);
pTaskLoop->stop();
pTaskLoop = NULL;
}
}
//....
return ;
}
注:
demo为了方便演示实际上是在工作线程中使用了同步等待。
使用TaskLoop最好结合SOUI的NotifyCenter对象一起使用,在异步任务中需要通知UI层,使用NotifyCenter是最简单有效的。
更多用法参考SOUI的壁纸demo: https://github.com/soui-demo/SouiWallPaper
启程软件 2019-02-03
SOUI中TaskLoop组件介绍的更多相关文章
- Blazor 组件库 BootstrapBlazor 中Editor组件介绍
组件介绍 Editor组件是对Summernote 组件的二次封装. 组件分为div模式和editor模式. 默认状态下editor模式的组件样子如下: 其代码如下: <Editor @bind ...
- k8s-架构中各个组件介绍
参考链接:https://github.com/opsnull/follow-me-install-kubernetes-cluster kubernetes 概述 1.kubernetes 是什么 ...
- 开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)
在这个.NET组件的介绍系列中,受到了很多园友的支持,一些园友(如:数据之巅. [秦时明月]等等这些大神 )也给我提出了对应的建议,我正在努力去改正,有不足之处还望大家多多包涵.在传播一些简单的知识的 ...
- 免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
前面介绍了六种.NET组件,其中有一种组件是写文件的压缩和解压,现在介绍另一种文件的解压缩组件SharpZipLib.在这个组件介绍系列中,只为简单的介绍组件的背景和简单的应用,读者在阅读时可以结合官 ...
- 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)
很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...
- 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...
- 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...
- 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)
在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...
- 高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)
在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是”这个系统似乎就是专门操作文档的“.毕竟现在的很多办公中大都是在PC端操作文档等软件,在这些庞大而繁重的业务中,单 ...
随机推荐
- APP 后台学习笔记
1.APP后台功能: 远程存储数据.消息中转 2.架构是业务驱动,可能随着开发进程而变化,没有最完美架构 3.架构不要满足追求技术新奇酷炫,而是结合具体业务使用合适的技术,否则会给运维带来很多不必要的 ...
- 什么是MIPI
随着客户要求手机摄像头像素越来越高同时要求高的传输速度传统的并口传输越来越受到挑战.提高并口传输的输出时钟是一个办法但会导致系统的EMC设计变得越来困难,增加传输线的位数是但是这又不符合小型化 ...
- C语言的第一堂课
感觉茂哥讲了很多,但是有些输入的语句还是没能记住 刚讲的都是概念,看来需要看一下表格,以及C语言的基础 有些意思还不能够理解 略显尴尬 回去把C语言书的各种概念理解一下……
- ES6随手学
1.遍历字符串 for (let codePoint of 'foo') { console.log(codePoint) } 格式:for(let print of string){ } p ...
- 计算机网络(HTTP)之客户识别:cookie机制
什么是cookie? 承载用户相关信息的HTTP首部 cookie的工作原理 cookie的缺陷 一.什么是cookie? cookie是由服务器生成,发送给USER-Agent(一般是浏览器),(服 ...
- sql连接查询中的分类
sql连接查询中的分类 1.内连接(结果不保留表中未对应的数据) 1.1等值连接:关联条件的运算符是用等号来连接的. 1.2不等值连接:连接条件是出等号之外的操作符 1.3自然连接:特殊的等值连接,在 ...
- Mathematica 代码
s1 = ContourPlot3D[x^2 + z^2 == 1, {x, -1, 1}, {y, 0, 1}, {z, -1, 1}] s2 = ContourPlot3D[ y == 1 + S ...
- sqlyog试用期到期--win10
1.win+R打开搜索框,输入regedit,打开windows注册表 2.删除HKEY_CURRENT_USER 下 software 的前几个随机编码.
- C++多态、虚函数、纯虚函数、抽象类、虚基类
一.C++多态 C++的多态包括静态多态和动态多态.静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态是指在编译期间就可以确定,动态多态是指在程序运行时才能确定. 二.虚函数 1.虚函数为类 ...
- 【JS】Javascript数组操作
1.提取数组中每个对象的某个属性组成新的数组 如数组为: let arry = [ { name: 'zhao', 'age': 18 }, { name: 'qian', 'age': 19 }, ...