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. echarts Map(地图) 不同颜色区块显示

    以河南地图为例: 代码如下: <h3>天翼日必达完成率</h3> <div id="map" style="height:340px; te ...

  2. 题解 P1801 【黑匣子_NOI导刊2010提高(06)】

    蒟蒻来发题解了.我仔细看了一下其他题解,各位巨佬用了堆,红黑树,splay,treap之类的强大算法,表示蒟蒻的我只会口胡这些算法,所以我决定用一种极其易理解的算法————fhq treap,作为tr ...

  3. (五)聊一聊深Copy与浅Copy

    一.关于浅copy与深copy 首先说明一下: 在python中,赋值其实就是对象的引用,变量就是对象的一个标签,如果把内存对象比喻成一个个房间,那么变量就是门牌号. 深copy与浅copy只是针对可 ...

  4. 作业二Wordcount

    1,github地址 https://github.com/dtneverdie/word-count 2,PSP表格 3,解题思路 先从理论上判断应该先将文件内的字符全部读入,然后根据分隔符来进行单 ...

  5. important的妙用解决firefox和ie的css兼容问题

    设置css的min-height属性.min-height在Firefox里有效,但IE无法识别.下面有个不错的解决方案,大家可以参考下 对于某些内容可变的层(比如用户评论),我们希望它有个最小的高度 ...

  6. 手把手编写PHP MVC框架实例教程

    源地址:https://www.awaimai.com/128.html#comment-27466 这个不错,用php实现mvc最核心功能,代码量只有几十K. 其实,不管用那种方法,最终都是incl ...

  7. window C/C++ 简单的IDE编译器

    C-Free 官网链接: http://www.programarts.com/cfree_ch/download.htm

  8. 记事本:js简介

    引用js和css很类似,大致有三种方式: 第一种: 在行内引用js, <div onclick="alert(111);"> </div> 第二种: 在行外 ...

  9. 使用Mermaid画图

    流程图的示例 时序图的示例 甘特图的示例 FAQ 很多时候,你想解释自己的想法/代码,但是用语言来表达会很啰嗦,并且读者也不易理解.一般这种情况下,我们都会想使用图解来解释.但是,我们也不会想下载那些 ...

  10. sed 修改文本

    修改文本是指将所匹配的文本行利用新文本替代,sed编辑命令的修改文本符号为 c\, [ sed]$ more input [ sed]$ more aa.sed #!/bin/sed -f //c\ ...