/* * 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 #include #include "Util/logger.h" #include "Util/util.h" #include "Util/RingBuffer.h" #include "Thread/threadgroup.h" #include using namespace std; using namespace toolkit; //环形缓存写线程退出标记 [AUTO-TRANSLATED:ceeb4c96] // Ring buffer write thread exit flag bool g_bExitWrite = false; //一个30个string对象的环形缓存 [AUTO-TRANSLATED:fee6a014] // A ring buffer of 30 string objects RingBuffer::Ptr g_ringBuf(new RingBuffer(30)); //写事件回调函数 [AUTO-TRANSLATED:19f6b6fa] // Write event callback function void onReadEvent(const string &str){ //读事件模式性 [AUTO-TRANSLATED:12cdd3a8] // Read event mode DebugL << str; } //环形缓存销毁事件 [AUTO-TRANSLATED:7da356eb] // Ring buffer destruction event void onDetachEvent(){ WarnL; } //写环形缓存任务 [AUTO-TRANSLATED:1467fea5] // Write ring buffer task void doWrite(){ int i = 0; while(!g_bExitWrite){ //每隔100ms写一个数据到环形缓存 [AUTO-TRANSLATED:aedec620] // Write data to the ring buffer every 100ms g_ringBuf->write(to_string(++i),true); usleep(100 * 1000); } } int main() { //初始化日志 [AUTO-TRANSLATED:371bb4e5] // Initialize log Logger::Instance().add(std::make_shared()); Logger::Instance().setWriter(std::make_shared()); auto poller = EventPollerPool::Instance().getPoller(); RingBuffer::RingReader::Ptr ringReader; poller->sync([&](){ //从环形缓存获取一个读取器 [AUTO-TRANSLATED:c61b1c37] // Get a reader from the ring buffer ringReader = g_ringBuf->attach(poller); //设置读取事件 [AUTO-TRANSLATED:6d9e7c68] // Set read event ringReader->setReadCB([](const string &pkt){ onReadEvent(pkt); }); //设置环形缓存销毁事件 [AUTO-TRANSLATED:8fc24dc3] // Set ring buffer destruction event ringReader->setDetachCB([](){ onDetachEvent(); }); }); thread_group group; //写线程 [AUTO-TRANSLATED:f91ceacd] // Write thread group.create_thread([](){ doWrite(); }); //测试3秒钟 [AUTO-TRANSLATED:942e7c08] // Test for 3 seconds sleep(3); //通知写线程退出 [AUTO-TRANSLATED:b2b2a2af] // Notify write thread to exit g_bExitWrite = true; //等待写线程退出 [AUTO-TRANSLATED:8150eaf3] // Wait for write thread to exit group.join_all(); //释放环形缓冲,此时异步触发Detach事件 [AUTO-TRANSLATED:3aaaa2f4] // Release ring buffer, triggering Detach event asynchronously g_ringBuf.reset(); //等待异步触发Detach事件 [AUTO-TRANSLATED:a6ea0f45] // Wait for asynchronous Detach event trigger sleep(1); //消除对EventPoller对象的引用 [AUTO-TRANSLATED:4f22453d] // Remove reference to EventPoller object ringReader.reset(); sleep(1); return 0; }