POCO C++库学习和分析——任务
1、任务的定义
任务虽然在Poco::Foundation库的目录中被单独划出来,其实可以被看成线程的应用,放在线程章节。首先来看一下Poco中对任务的描述:
*task主要应用在GUI和Sever程序中,用于追踪后台线程的进度。
*应用Poco任务时,需要类Poco::Task和类Poco::TaskManager配合使用。其中类Poco::Task继承自Poco::Runnable,它提供了接口可以便利的报告线程进度。Poco::TaskManager则对Poco::Task进行管理。
*为了完成取消和上报线程进度的工作:
a、使用者必须从Poco::Task创建一个子类并重写runTask()函数
b、为了完成进度上报的功能,在子类的runTask()函数中,必须周期的调用setProgress()函数去上报信息
c、为了能够在任务运行时终止任务,必须在子类的runTask()函数中,周期性地调用isCancelled()或者sleep()函数,去检查是否有任务停止请求
d、如果isCancelled()或者sleep()返回真,runTask()返回。
*Poco::TaskManager通过使用Poco::NotificationCenter去通知所有需要接受任务消息的对象
从上面的描述可以看出,Poco中Task的功能就是能够自动汇报线程的运行进度。
2、任务用例
#include <iostream>
#include "Poco/Task.h"
#include "Poco/TaskManager.h"
#include "Poco/TaskNotification.h"
#include "Poco/Observer.h"
#include <string> class TaskExample:public Poco::Task{
public:
TaskExample(const std::string name):Poco::Task(name){}
void runTask(){ for (int i = ; i <= ; i ++) {
setProgress(float(i)/);
if (sleep()) {
break;
}
}
}
};
class ProgressHandler{
public:
void onProgress(Poco::TaskProgressNotification * pNf){
std::cout << pNf->task()->name() << " progress:";
std::cout << pNf->progress()* << "%" << std::endl;
pNf->release();
}
void onFinished(Poco::TaskFinishedNotification * pNf){
std::cout << pNf->task()->name() << " finished.\n";
pNf->release();
}
};
int main(int argc, char** argv)
{
Poco::TaskManager tm;
ProgressHandler pm;
tm.addObserver(Poco::Observer<ProgressHandler, Poco::TaskProgressNotification>
(pm,&ProgressHandler::onProgress)
);
tm.addObserver(Poco::Observer<ProgressHandler, Poco::TaskFinishedNotification>
(pm,&ProgressHandler::onFinished)
);
tm.start(new TaskExample("Task1"));
tm.start(new TaskExample("Task2"));
tm.joinAll();
return ;
}
(版权所有,本文转载自:http://blog.csdn.net/arau_sh/article/details/8620810)
POCO C++库学习和分析——任务的更多相关文章
- python 操作exls学习之路1-openpyxl库学习
这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...
- linux下查看动态链接库依赖关系的命令 x86: ldd *.so arm: arm-linux-readelf -d *.so 实际例子: 以项目中用到的库librtsp.so分析: lijun@ubuntu:~/workspace$ arm-hisiv100nptl-linux-ld -d librtsp.so arm-hisiv100nptl-linux-ld:
linux下查看动态链接库依赖关系的命令 x86:ldd *.so arm:arm-linux-readelf -d *.so 实际例子:以项目中用到的库librtsp.so分析:l ...
- Libev库学习
Libev库学习 https://www.cnblogs.com/wunaozai/p/3950249.html Libev库学习(1)https://www.cnblogs.com/wunaozai ...
- dlib库学习之一
dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...
- python_库学习_01
一.python的库学习之 财经数据接口包 1.安装ThShare 直接pip install tushare 可能会出现缺少依赖库的情况,依次安装,大概有lxml,pandas,bs4,reques ...
- numpy, matplotlib库学习笔记
Numpy库学习笔记: 1.array() 创建数组或者转化数组 例如,把列表转化为数组 >>>Np.array([1,2,3,4,5]) Array([1,2,3,4,5]) ...
- python爬虫解析库学习
一.xpath库使用: 1.基本规则: 2.将文件转为HTML对象: html = etree.parse('./test.html', etree.HTMLParser()) result = et ...
- 【mmall】Guava库学习Collections
参考链接 Guava库学习:学习Collections(三)Sets
- USB开发库STSW-STM32121文件分析(转)
源: USB开发库STSW-STM32121文件分析
随机推荐
- js笔记---(运动)通用的move方法,兼容透明度变化
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- jquery 实现页面局部刷新ajax做法
这个方法就多了去了,常见的有以下几种:下面介绍全页面刷新方法:有时候可能会用到 window.location.reload()刷新当前页面. parent.location.reload()刷新父亲 ...
- mediastream2使用指南(转载)
http://blog.sina.com.cn/s/blog_59d649610100diui.html 定义 Filter: 媒体库中处理数据的组件.一个filter有0到数个输入流和0到数个输出流 ...
- Bean的生命周期
Bean的生命周期 原文:http://997004049-qq-com.iteye.com/blog/1729793 任何一个事物都有自己的生命周期,生命的开始.生命中.生命结束.大家最熟悉的应该是 ...
- norm函数
如果A为向量 norm(A,p) 返回向量A的p范数. norm(A) 返回向量A的2范数,即等价于norm(A,2).
- Mybaits 之根据集合查询和逗号分隔的子查询
这是我们的mapper要根据传入一个集合进行查询: List<ExtKeywordCategory> findListByIds(List<ExtKeywordFkCategory& ...
- ubuntu下安装花生壳
下载地址:http://hsk.oray.com/download/#type=linux 官方的文档: 花生壳(公网版) for linux的安装以及使用 Linux花生壳(公网版)将大大简化大家的 ...
- combotree的加载方法
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
- LTMP手动编译安装以及全自动化部署实践(附详细代码)
大家使用LNMP架构,一般可以理解为Linux Shell为CentOS/RadHat/Fedora/Debian/Ubuntu/等平台安装LNMP(Nginx/MySQL /PHP),LNMPA(N ...
- 数据库SQL语句练习题10--18
10.查询Score表中的最高分的学生学号和课程号.(子查询或者排序) select t.sno,t.cno from SCORE t where degree = (select max(degre ...