You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.2 KiB
C++

12 months ago
/*
* 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;
}