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端操作文档等软件,在这些庞大而繁重的业务中,单 ...
随机推荐
- (N叉树 DFS 递归 BFS) leetcode 559. Maximum Depth of N-ary Tree
Given a n-ary tree, find its maximum depth. The maximum depth is the number of nodes along the longe ...
- jQuery第1天
概念 jQuery 是一个 JavaScript 库,其实就是通过 原生JS 封装了的很多的 方法 和 属性. JS 库特点 JavaScript 库:由第三方开发者基于原生 JS 基础上,封装了很多 ...
- kafka 日常使用和数据副本模型的理解
kafka 日常使用和数据副本模型的理解 在使用Kafka过程中,有时经常需要查看一些消费者的情况.Kafka健康状况.临时查看.同步一些数据,又由于Kafka只是用来做流式存储,又没有像Mysql或 ...
- .net 笔试题目
2.1.using关键字有什么用?什么是IDisposable? using可以声明namespace的引入,还可以实现非托管资源的释放,实现了IDisposiable的类在using中创建,usin ...
- 网络结构---从alexnet 到resnet
AlexNet-> vgg vgg 采用更小的卷积核,加深网络深度,但两者的共同点都是卷积层+pooling层最后接上fc 层的结构 Network in network ->google ...
- 关于接口(Interface)
接口,其实是指类之间约定的协议,可以包含方法.属性.事件和索引: 接口成员不允许使用访问修饰符号(public.private.protected.internal),所有的接口成员都是公共的. 接口 ...
- winform 以不规则图形背景显示窗体
一:创建一个winform窗体,把BackgroundImage引入一个不规则的图片,设置属性BackgroundImageLayout为Stretch 二:主要代码 using System; us ...
- js一些格式化
/* 格式化金额 */function formatAmount(s, n) { n = n > 0 && n <= 20 ? n : 2; s = p ...
- MariaDB Galera Cluster部署实践
原理 官方地址:http://galeracluster.com/documentation-webpages/index.html Galera Cluster与传统的复制方式不同,不通过I/O_t ...
- 盒子取球C语言 蓝桥杯
盒子取球方法二今盒子里有 n 个小球,A.B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个, 也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定:每个人从盒子中取出 ...