任務

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的應用非常簡單,下面是其一個使用例子:
#include "Poco/Task.h"
#include "Poco/TaskManager.h"
#include "Poco/TaskNotification.h"
#include "Poco/Observer.h"

#include <iostream>

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實現了自動的垃圾收集。
發佈了15 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章