如何利用ACE_Task打点线程
当前位置:以往代写 > C/C++ 教程 >如何利用ACE_Task打点线程
2019-06-13

如何利用ACE_Task打点线程

如何利用ACE_Task打点线程

为什么要利用ACE_Task来打点线程

从C#转到C++后,感受到C++比C#最难的处所,就是在系统编程时,C#中有对应的类库,我打仗到一个类后,就可以通过这个类,知道许多相关的成果。而在C++中,必需利用Windows API,可是Windows API的缺点反而是不系统。好比,想要建设一个线程时,C#中可以通过新建一个Thread类,我获得这个类后,就可以通过辅佐可能MSDN相识到这个类中有哪些要领,如何打点线程等。可是C++中,建设一个线程,需要挪用CreateThread,但因为它是一个API,所以很难快速的相识到与线程打点相关的API,至少对我来说,这是一个难点。

C#的优势是以类的方法去打点线程,而C++ 挪用API更像是在单打独斗,显得出格出格狼藉。

那么在C++中,我们能不能以类的方法去打点线程呢。针对这个问题,ACE_Task便浮出了水面。

ACE_Task利用要领

ACE_Task对常用线程处理惩罚举办了OO包装,通过ACE_Task,能对线程举办更好的操纵。

按照ACE_Task的父类ACE_Task_Base中的注释,可以总结出以下几点:

想要利用ACE_Task,就要从ACE_Task派生一个子类,然后实现较量重要的几个虚要领。

实现处事初始化和终止要领:open()要领应该包括所有专属于任务的初始化代码。个中大概包罗诸如毗连节制块、锁和内存这样的资源。close() 要领是相应的终止要领。

挪用启用(Activation )要领:在主动工具实例化后,你必需通过挪用activate()启用它。要在主动工具中建设的线程的数目,以及其他一些参数,被通报给activate()要领。activate()要了解使svc()要领成为所有它生成的线程的启动点。

实现处事专有的处理惩罚要领:如上面所提到的,在主动工具被启用后,各个新线程在svc()要领中启动。应用开拓者必需在子类中界说此要领。

如何操作ACE_Task解决线程

编写ACE_Task的Demo

下面就通过总结的几点来编写一个Demo

首先是派生ACE_Task的子类ShowTask

Collapse#pragma once
#include "ace/Task_T.h"
#include <string>
#include <iostream>
using namespace std;
   
class ShowTask : public ACE_Task<ACE_SYNCH>
{
public:
  ShowTask(const char* str_to_show, int interval) : show_str_(str_to_show), interval_(interval)
  {
    //启动线程
    activate();
  }
  ~ShowTask()
  {
    //竣事线程
    close();
  }
public:
  virtual int open( void *args = 0 )
  {
    cout << "线程启动" << endl;
    return 0;
  }
   
  virtual int close( u_long flags = 0 )
  {
    cout << "线程竣事" << endl;
    return 0;
  }
   
  virtual int svc( void )
  {
    int time_begin = GetTickCount();
    while(true)
    {
      int time_end = GetTickCount();
      if(time_end - time_begin >= interval_)
      {
        time_begin = time_end;
        cout << show_str_ << endl;
      }
      Sleep(10);
    }
    return 0;
  }
private:
  //需要显示的信息
  string show_str_;
  //隔断多长时间举办显示
  int interval_;
};

然后在措施中挪用ShowTask

Collapse#include "ShowTask.h"
   
   
int _tmain(int argc, _TCHAR* argv[])
{
    ACE::init();
    string str = "这是一个测试措施";
    ShowTask task(str.c_str(), 1000);
   
    Sleep(10000);
    ACE::fini();
    return 0;
}

运行结果图:

如何操作ACE_Task解决线程

需要留意的处所

在措施中利用ACE_Task,那么就必需在利用前对ACE举办初始化,即挪用ACE::init要领,然后在措施竣事的时候挪用ACE::fini要领。假如没有举办初始化就挪用ShowTask,那么措施就会瓦解。

至于为什么会瓦解,以及ACE::init要领做了些什么,后续的文章中会具体的先容。

关于open要领的迷惑

从上面的测试图中可以看到,线程竣事后,挪用了close要领,可是在线程启动时并没有挪用open要领。

并且从谷歌找到的资料中也先容,在线程启动的时候回挪用open要领,并且他们的示例措施与本文中提供的demo中关于ACE_Task的利用要领也根基一致。

那么open要领为什么没有被挪用呢,毕竟是利用要领差池,照旧因为ACE版本差异导致的。关于这个问题也会在后续的文章中举办具体的先容。

作者:cnblogs 缘生梦

    关键字:

在线提交作业