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组件介绍的更多相关文章

  1. Blazor 组件库 BootstrapBlazor 中Editor组件介绍

    组件介绍 Editor组件是对Summernote 组件的二次封装. 组件分为div模式和editor模式. 默认状态下editor模式的组件样子如下: 其代码如下: <Editor @bind ...

  2. k8s-架构中各个组件介绍

    参考链接:https://github.com/opsnull/follow-me-install-kubernetes-cluster kubernetes 概述 1.kubernetes 是什么 ...

  3. 开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)

    在这个.NET组件的介绍系列中,受到了很多园友的支持,一些园友(如:数据之巅. [秦时明月]等等这些大神 )也给我提出了对应的建议,我正在努力去改正,有不足之处还望大家多多包涵.在传播一些简单的知识的 ...

  4. 免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)

    前面介绍了六种.NET组件,其中有一种组件是写文件的压缩和解压,现在介绍另一种文件的解压缩组件SharpZipLib.在这个组件介绍系列中,只为简单的介绍组件的背景和简单的应用,读者在阅读时可以结合官 ...

  5. 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)

    很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...

  6. 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

  7. 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)

    在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...

  8. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

  9. 高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)

    在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是”这个系统似乎就是专门操作文档的“.毕竟现在的很多办公中大都是在PC端操作文档等软件,在这些庞大而繁重的业务中,单 ...

随机推荐

  1. 第三篇--创建.gitignore文件

    小知识 ·  git add -A  提交所有变化 ·  git add -u  提交被修改(modified)和被删除(deleted)文件,不包括新文件(new) ·  git add .  提交 ...

  2. linux date -s

    修改linux的时间可以使用date指令 修改日期: 时间设定成2009年5月10日的命令如下: #date -s 05/10/2009 修改时间: 将系统时间设定成上午10点18分0秒的命令如下.  ...

  3. jsp:forward动作功能

    jsp:forward动作:引导请求者进入新的页面 例子:login.jsp <center><p>用户登录 </p> <form name="fo ...

  4. Vue-router(基础)_滚动行为和history模式

    一.前言 1.滚动事件 2.h5 history模式 二.主要内容 1.   (1)使用前度路由,当切换到新路由时,想要页面滚动到顶部,或者是保持原先滚动的位置,就像重新加载页面那样.vue-rout ...

  5. 解决ssh连接linux服务器速度慢

    服务器端sshd配置文件 /etc/ssh/sshd_config 看是否有如下的两条配置条目 GSSAPIAuthentication no UseDNS no 如果前面带#,请把#删掉,或者新添加 ...

  6. C#之C#、.NET Framework、CLR的关系

    转自 https://www.cnblogs.com/cocoon/p/4997005.html 补补基础: 很多人没有将C#..NET Framework(.NET框架).CLR(Common La ...

  7. DirectX11 With Windows SDK--23 立方体映射:动态天空盒的实现

    前言 上一章的静态天空盒已经可以满足绝大部分日常使用了.但对于自带反射/折射属性的物体来说,它需要依赖天空盒进行绘制,但静态天空盒并不会记录周边的物体,更不用说正在其周围运动的物体了.因此我们需要在运 ...

  8. Swagger Edit 安装和使用教程

    Swagger Edit介绍Swagger是专门用来管理接口一个工具.在开发过程中,接口一直是纷争的聚焦点,能有效管理接口(保存好记录.及时更新.方便查看.接口测试).会让整个项目开发效率提升很大. ...

  9. python excel写入及追加写入

    # -*- coding:utf-8 _*- """ @author:Administrator @file: excel.py Description :如果行数是10 ...

  10. PhpStorm常用快捷键以及如何连接外部服务器

    PhpStorm常用快捷键以及如何连接外部服务器 PhpStorm作为我们phper使用的一款IDE,其功能是非常强大的,现在记录下常用的快捷键以及如何使用它与外部服务器进行连接使用. 一.Keyma ...