POCO C++库学习和分析 -- 通知和事件

转载 2016年08月31日 16:10:58
1. 任务的定义
        任务虽然在Poco::Foundation库的目录结构中被单独划出,其实也可以被看成线程的应用,放在线程章节。首先来看一下Poco中对于任务的描述:
task主要应用在GUI和Seerver程序中,用于追踪后台线程的进度。
应用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. 任务用例
        Task的应用非常简单,下面是其一个使用例子:
[cpp]  
#include <iostream>

#include "Poco/Task.h"
#include "Poco/TaskManager.h"
#include "Poco/TaskNotification.h"
#include "Poco/Observer.h"

using Poco::Observer;
using namespace std;

class SampleTask: public Poco::Task
{
public:
    SampleTask(const std::string& name): Task(name)
    {

    }

    void runTask()
    {
        for (int i = 0; i < 100; ++i)
        {
            setProgress(float(i)/100); // report progress
            if (sleep(1000))
                break;
        }
    }
};

class ProgressHandler
{
public:
    void onProgress(Poco::TaskProgressNotification* pNf)
    {
        std::cout << pNf->task()->name()
            << " progress: " << pNf->progress() << std::endl;
        pNf->release();
    }

    void onFinished(Poco::TaskFinishedNotification* pNf)
    {
        std::cout << pNf->task()->name() << " finished." << std::endl;
        pNf->release();
    }
};

int main(int argc, char** argv)
{
    Poco::TaskManager tm;
    ProgressHandler pm;
    tm.addObserver(
        Observer<ProgressHandler, Poco::TaskProgressNotification>
        (pm, &ProgressHandler::onProgress)
        );
    tm.addObserver(
        Observer<ProgressHandler, Poco::TaskFinishedNotification>
        (pm, &ProgressHandler::onFinished)
        );
    tm.start(new SampleTask("Task 1")); // tm takes ownership
    tm.start(new SampleTask("Task 2"));
    tm.joinAll();
    return 0;
}
 
3. Task类图
        最后给出Poco中Task的类图。


        在类图中,我们可以看到Task类继承自RefCountedObject,这主要是为了Task类的管理。TaskManger对Task实现了自动的垃圾收集。

Poco 的通知和事件

1,Notification // POCOEvent.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "Poco/Notifi...
  • haifengzhilian
  • haifengzhilian
  • 2015年12月04日 14:32
  • 1635

POCO C++库学习和分析 -- 日志 (一)

日志对于程序来说是非常重要的,特别是对一些大型程序而言。一旦程序被发布,在现场日志几乎是程序员唯一可以获取程序信息的手段。Poco作为一个框架类库,提供了非常多的日志种类供程序员选用。文章将分两个部分...
  • llg070401046
  • llg070401046
  • 2016年08月31日 13:15
  • 6225

ROS+SLAM笔记(5)创建包

1 先创建工作空间$ mkdir –p ~/dev/catkin_ws/src $ cd ~/dev/catkin_ws/src $ catkin_init_workspace2 编译工作空间$ cd...
  • gzs0927
  • gzs0927
  • 2017年11月11日 17:28
  • 79

虚函数

先看一段在构造函数中直接调用虚函数的代码: 1 #include 2 3 class Base 4 { 5 public: 6 Base() { Foo(); } ...
  • lusic01
  • lusic01
  • 2018年01月19日 16:08
  • 6

Poco::Event

Poco::Event是用于多线程之间的同步,其wait调用会阻塞一个线程的执行,当其他线程对此事件set操作后,此线程会继续运行。事件有两种,一种是自动复位,另一种是手动复位。 Event类 ...
  • fym0121
  • fym0121
  • 2012年08月18日 16:35
  • 4032

C++跨平台开源库POCO学习笔记

原文链接:http://grow.sinaapp.com/?p=1271 POCO(pocoproject.org)看起来是很不错的C++跨平台开源库,包含网络(HTTP、FTP等)、正则、XML、...
  • heb_feng
  • heb_feng
  • 2013年06月08日 16:22
  • 8494

OSGI学习笔记一(事件传递)

一、定义在jujianzh传递事件的类
  • waterbbx
  • waterbbx
  • 2014年11月07日 18:35
  • 8037

android actionbar setCustomView时布局整体右移解决方案

最近在做了一个项目,我用的是开源的actionbarsherlock开源框架,至于为什么用这个我个人觉得很好用,还有人经常维护,这样出问题好解决,源码也可以看见,我自定义了一个actionbar的布局...
  • shangbobobo
  • shangbobobo
  • 2015年01月19日 11:32
  • 9246

Poco C++库简介

学习一个框架前,要先明白它的是什么,为什么,怎么用.下面这些文字,是从中文poco官网上转过来的,正如poco c++库的特点,非常清晰,代码风格更是一目了然.    poco开发库的特点,非常适合...
  • llg070401046
  • llg070401046
  • 2016年08月31日 10:32
  • 2786

POCO C++库学习和分析 -- 序

POCO C++库学习和分析 -- 序 1. POCO库概述: POCO是一个C++的开源库集。同一般的C++库相比,POCO的特点是提供了整一个应用框架。如果要做C++程序应用框架的快速开发...
  • u010129251
  • u010129251
  • 2015年03月26日 09:32
  • 5722
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POCO C++库学习和分析 -- 通知和事件
举报原因:
原因补充:

(最多只允许输入30个字)