XTools.h
#pragma once #include#include #include #define LOG_MIN_LEVEL LOG_LEVEL_DEBUG #define LOG(level, str) if(((level) >= LOG_MIN_LEVEL) && ((level) < LOG_LEVEL_MAX)) { cout << log_level[level] << " (" << __FILE__ << ":" << __LINE__ << ") " << str << endl; } #define LOG_DEBUG(str) LOG(LOG_LEVEL_DEBUG, str) #define LOG_INFO(str) LOG(LOG_LEVEL_INFO, str) #define LOG_ERROR(str) LOG(LOG_LEVEL_ERROR, str) #define LOG_FATAL(str) LOG(LOG_LEVEL_FATAL, str) enum LOG_LEVEL_TYPE { LOG_LEVEL_DEBUG, LOG_LEVEL_INFO, LOG_LEVEL_ERROR, LOG_LEVEL_FATAL, LOG_LEVEL_MAX }; static const char* log_level[LOG_LEVEL_MAX] = { "[DEBUG]", "[INFO]", "[ERROR]", "[FATAL]" }; class XThread { public: XThread(); virtual bool start(); virtual bool stop(); protected: virtual void main() = 0; protected: std::thread m_th; bool m_isExit; int m_index; // 线程索引号 std::mutex m_mtx; };
XTools.cpp
#include "Xtools.h" #includeusing namespace std; XThread::XThread() { m_isExit = false; m_index = 0; } bool XThread::start() { bool ret = true; static int i = 0; stringstream ss; m_mtx.lock(); i++; m_index = i; m_isExit = false; m_mtx.unlock(); m_th = thread(&XThread::main, this); ss << "Thread" << m_index << " start!"; LOG_INFO(ss.str()); return ret; } bool XThread::stop() { bool ret = true; stringstream ss; m_mtx.lock(); m_isExit = true; m_mtx.unlock(); m_th.join(); ss << "Thread" << m_index << " stop!"; LOG_INFO(ss.str()); return ret; }
126_rtsp_demux_thread.cpp
#include#include "XDemux.h" #include "XMux.h" #include "Xtools.h" using namespace std; extern "C" // 指定函数是 C 语言函数,函数目标名不包含重载标识,C++ 中调用 C 函数需要使用 extern "C" { // 引用 ffmpeg 头文件 #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" } // 预处理指令导入库 #pragma comment(lib, "avcodec.lib") #define CERR(err) if(err != 0) { PrintError(err); return -1; } class Test : public XThread { private: void main() { while (!m_isExit) { LOG_INFO("Test"); this_thread::sleep_for(1s); } } }; int main(int argc, char* argv[]) { Test t; t.start(); this_thread::sleep_for(3s); t.stop(); return 0; }
XTools文件中存放共用的一些函数,XThread 为线程类。
LOG 有四个等级,只有 LOG 等级大于最低等级的时候,调试信息才会打印出来。
测试用例运行结果如下图所示:



