代码回顾

Posted 琴鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码回顾相关的知识,希望对你有一定的参考价值。

 

1.继承和多态,多线程

做棋牌demo的时候,基本模型都是事件轮询,每个事件一个线程。

所以做了一个基类和派生类。使用了常见的功能。

有几个基础知识点

1.派生类访问基类public方法:基类::方法名字  ,如。IEventLoop::Close();

2.派生类的构造函数不指定,会调用默认的基类构造函数。也可以指定,如 Loop_Log():IEventLoop(){}

3.派生类的构造顺序,基类默认构造,派生类构造。   而派生类析构,是相反,派生类析构,基类析构。

4.vecotr<t>,析构的时候会调用元素的析构函数,如果是原始指针类型,那么只是free 掉指针而已。如果是对象,那么必定会调用元素的析构函数。所以感觉  class EventsMgr的数据成员用vector<shared_ptr<t>>,会更好,这样,使用者

就不用考虑析构的问题,让使用者能更自然使用new.到堆中。

 5.如果要制定顺序关闭服务器。只需要更改下EventsMgr的close 函数。逐个判断是否关闭。

#include <iostream>
#include "stdio.h"
#include <memory>
#include <unistd.h>
#include <thread>
#include <vector>

using namespace std;


class IEventLoop
{
public:
    IEventLoop():shouldloop(true),stop(false){}
    virtual void Start()=0;
    bool IsStart()
    {
        return shouldloop;
    }
    virtual void Close()
    {
        shouldloop=false;
    }
    bool IsClosed()
    {
        return stop;
    }
    
    virtual ~IEventLoop(){}
protected:
    bool shouldloop;
    bool stop;
};


class Loop_Log:public IEventLoop
{
public:
    Loop_Log(){}
    void Start()
    {
        while(shouldloop)
        {
            cout<<"log is runing"<<endl;
            sleep(1);
        }
        stop=true;
    }
    
    void Close()
    {
        IEventLoop::Close();
        cout<<"log is closed"<<endl;
    }
    
    ~Loop_Log()
    {
        int a=3;
    }
};


class Epollserver:public IEventLoop
{
public:
    Epollserver(){}
    void Start()
    {
        while(shouldloop)
        {
            cout<<"epollserver is runing"<<endl;
            sleep(1);
        }
        stop=true;
    }
    
    void Close()
    {
        IEventLoop::Close();
        cout<<"epollserver is closed"<<endl;
    }
    
    ~Epollserver()
    {
        int a=3;
    }
};

class EventsMgr
{
public:
    void AddEvent(IEventLoop* _event)
    {
        if(_event!=0)
        {
            events.push_back(_event);
        }
    }
    void Start()
    {
        for(size_t i=0;i<events.size();++i)
        {
            auto lamfun=[](IEventLoop* pi){ pi->Start();};
            thread logthread=thread(lamfun,events[i]);
            logthread.detach();
        }
    }
    
    void Close()
    {
        bool allexist=false;

        for(size_t i=0; i<events.size(); ++i)
        {
            if (events[i]!=0x0)
            {events[i]->Close();}
        }
        while(!allexist)
        {
            allexist=true;

            for(size_t i=0; i<events.size(); ++i)
            {
                if(events[i]->IsClosed()==false)
                {
                    allexist=false;
                    break;
                }
            }
        }
    }
private:
    vector<IEventLoop*> events;
};




int main()
{
    EventsMgr mymgr;
    
    Loop_Log mylog;
    mymgr.AddEvent(&mylog);
    
    //vector<Loop_Log> test;
    //test.push_back(mylog);
    
    Epollserver myserver;
    mymgr.AddEvent(&myserver);
    
    mymgr.Start();
    
    string cmd;
    cin>>cmd;
    
    while(cmd=="88")
    {
        mymgr.Close();
        break;
    }
    
    
}

 修改后vector元素为共享指针。

#include <iostream>
#include "stdio.h"
#include <memory>
#include <unistd.h>
#include <thread>
#include <vector>

using namespace std;


class IEventLoop
{
public:
    IEventLoop():shouldloop(true),stop(false){}
    virtual void Start()=0;
    bool IsStart()
    {
        return shouldloop;
    }
    virtual void Close()
    {
        shouldloop=false;
    }
    bool IsClosed()
    {
        return stop;
    }
    
    virtual ~IEventLoop(){}
protected:
    bool shouldloop;
    bool stop;
};


class Loop_Log:public IEventLoop
{
public:
    Loop_Log():IEventLoop(){}
    void Start()
    {
        while(shouldloop)
        {
            cout<<"log is runing"<<endl;
            sleep(1);
        }
        stop=true;
    }
    
    void Close()
    {
        IEventLoop::Close();
        cout<<"log is closed"<<endl;
    }
    
    ~Loop_Log()
    {
        int a=3;
    }
};


class Epollserver:public IEventLoop
{
public:
    Epollserver(){}
    void Start()
    {
        while(shouldloop)
        {
            cout<<"epollserver is runing"<<endl;
            sleep(1);
        }
        stop=true;
    }
    
    void Close()
    {
        IEventLoop::Close();
        cout<<"epollserver is closed"<<endl;
    }
    
    ~Epollserver()
    {
        int a=3;
    }
};

class EventsMgr
{
public:
    void AddEvent(shared_ptr<IEventLoop> _event)
    {
        if(_event!=0)
        {
            events.push_back(_event);
        }
    }
    void Start()
    {
        for(size_t i=0;i<events.size();++i)
        {
            auto lamfun=[](shared_ptr<IEventLoop> pi){ pi->Start();};
            thread logthread=thread(lamfun,events[i]);
            logthread.detach();
        }
    }
    
    void Close()
    {
        bool allexist=false;

        for(size_t i=0; i<events.size(); ++i)
        {
            if (events[i]!=0x0)
            {events[i]->Close();}
        }
        while(!allexist)
        {
            allexist=true;

            for(size_t i=0; i<events.size(); ++i)
            {
                if(events[i]->IsClosed()==false)
                {
                    allexist=false;
                    break;
                }
            }
        }
    }
private:
    vector<shared_ptr<IEventLoop> > events;
};


int main()
{
    EventsMgr mymgr;
    
    mymgr.AddEvent(shared_ptr<IEventLoop>(new Loop_Log()));
    mymgr.AddEvent(shared_ptr<IEventLoop>(new Epollserver()));
    
    mymgr.Start();
    
    string cmd;
    cin>>cmd;
    
    while(cmd=="88")
    {
        mymgr.Close();
        break;
    }
}

 

以上是关于代码回顾的主要内容,如果未能解决你的问题,请参考以下文章

[译] 如何在React中写出更优秀的代码

微信小程序代码片段

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

VSCode自定义代码片段——CSS选择器

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器