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)
