/* * Copyright (c) 2016 The ZLToolKit project authors. All Rights Reserved. * * This file is part of ZLToolKit(https://github.com/ZLMediaKit/ZLToolKit). * * Use of this source code is governed by MIT license that can be found in the * LICENSE file in the root of the source tree. All contributing project authors * may be found in the AUTHORS file in the root of the source tree. */ #include <csignal> #include <iostream> #include "Util/logger.h" #include "Util/util.h" #include "Util/RingBuffer.h" #include "Thread/threadgroup.h" #include <list> using namespace std; using namespace toolkit; //环形缓存写线程退出标记 bool g_bExitWrite = false; //一个30个string对象的环形缓存 RingBuffer<string>::Ptr g_ringBuf(new RingBuffer<string>(30)); //写事件回调函数 void onReadEvent(const string &str){ //读事件模式性 DebugL << str; } //环形缓存销毁事件 void onDetachEvent(){ WarnL; } //写环形缓存任务 void doWrite(){ int i = 0; while(!g_bExitWrite){ //每隔100ms写一个数据到环形缓存 g_ringBuf->write(to_string(++i),true); usleep(100 * 1000); } } int main() { //初始化日志 Logger::Instance().add(std::make_shared<ConsoleChannel>()); Logger::Instance().setWriter(std::make_shared<AsyncLogWriter>()); auto poller = EventPollerPool::Instance().getPoller(); RingBuffer<string>::RingReader::Ptr ringReader; poller->sync([&](){ //从环形缓存获取一个读取器 ringReader = g_ringBuf->attach(poller); //设置读取事件 ringReader->setReadCB([](const string &pkt){ onReadEvent(pkt); }); //设置环形缓存销毁事件 ringReader->setDetachCB([](){ onDetachEvent(); }); }); thread_group group; //写线程 group.create_thread([](){ doWrite(); }); //测试3秒钟 sleep(3); //通知写线程退出 g_bExitWrite = true; //等待写线程退出 group.join_all(); //释放环形缓冲,此时异步触发Detach事件 g_ringBuf.reset(); //等待异步触发Detach事件 sleep(1); //消除对EventPoller对象的引用 ringReader.reset(); sleep(1); return 0; }