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、任務用例

  

 1 #include <iostream>
 2 #include "Poco/Task.h"
 3 #include "Poco/TaskManager.h"
 4 #include "Poco/TaskNotification.h"
 5 #include "Poco/Observer.h"
 6 #include <string>
 7 
 8 class TaskExample:public Poco::Task{
 9 public:
10     TaskExample(const std::string name):Poco::Task(name){}
11     void runTask(){
12 
13         for (int i = 0; i <= 100; i ++) {
14             setProgress(float(i)/100);
15             if (sleep(100)) {
16                 break;
17             }
18         }
19     }
20 };
21 class ProgressHandler{
22 public:
23     void onProgress(Poco::TaskProgressNotification * pNf){
24         std::cout << pNf->task()->name() << " progress:";
25         std::cout << pNf->progress()*100 << "%" << std::endl;
26         pNf->release();
27     }
28     void onFinished(Poco::TaskFinishedNotification * pNf){
29         std::cout << pNf->task()->name() << " finished.\n";
30         pNf->release();
31     }
32 };
33 int main(int argc, char** argv)
34 {
35     Poco::TaskManager tm;
36     ProgressHandler pm;
37     tm.addObserver(Poco::Observer<ProgressHandler, Poco::TaskProgressNotification>
38                    (pm,&ProgressHandler::onProgress)
39                    );
40     tm.addObserver(Poco::Observer<ProgressHandler, Poco::TaskFinishedNotification>
41                    (pm,&ProgressHandler::onFinished)
42                    );
43     tm.start(new TaskExample("Task1"));
44     tm.start(new TaskExample("Task2"));
45     tm.joinAll();
46     return 0;
47 }

 

(版權所有,本文轉載自:http://blog.csdn.net/arau_sh/article/details/8620810


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM