poco 线程类 学习
运行业务逻辑的类都继承自Runnable类
Runnable类中带有纯虚函数run()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Runnable /// The Runnable interface with the run() method /// must be implemented by classes that provide /// an entry point for a thread. { public : Runnable(); virtual ~Runnable(); virtual void run() = 0; /// Do whatever the thread needs to do. Must /// be overridden by subclasses. }; Runnable::Runnable() { } Runnable::~Runnable() { } |
而继承自Runnable类的各种业务逻辑类均实现自己的run 由于Thread类
进行调用。Thread类控制start 以及stop
类似
XClass x; // 某个类 Thread thread; thread.start(x);
Thread类流程如下:
void Thread::start(Runnable& target) { startImpl(target); } void ThreadImpl::startImpl(Runnable& target) { // 这里将业务逻辑类的指针赋予给_pRunnableTarget _pRunnableTarget = ⌖ createImpl(runnableEntry, this); } //createImpl函数 运行线程函数 ent也就是(runnableEntry void ThreadImpl::createImpl(Entry ent, void* pData) { #if defined(_DLL) _thread = CreateThread(NULL, _stackSize, ent, pData, 0, &_threadId); #else unsigned threadId; _thread = (HANDLE) _beginthreadex(NULL, _stackSize, ent, this, 0, &threadId); _threadId = static_cast<DWORD>(threadId); #endif } unsigned __stdcall ThreadImpl::runnableEntry(void* pThread) { try { // void ThreadImpl::startImpl(Runnable& target)
// 函数中已经记录业务逻辑类指针 // _pRunnableTarget就是之前赋值的业务逻辑类 reinterpret_cast<ThreadImpl*>(pThread)->_pRunnableTarget->run(); } return 0; }
自己模拟了一个简单类型,没有使用ThreadImpl.vs2008代码
#include <windows.h> #include <iostream> #include <process.h> using namespace std; class CRunnable { public: CRunnable() {} ~CRunnable() {} virtual void run() = 0; }; class CTest: public CRunnable { virtual void run() {cout << __FUNCTION__ << endl;} }; class CThread { HANDLE _thread; CRunnable* _pRunnableTarget; public: void threadCleanup(); void join(); static unsigned __stdcall runnableEntry(void* pThread); void start(CRunnable& runnable); }; unsigned __stdcall CThread::runnableEntry(void* pThread) { reinterpret_cast<CThread*>(pThread)->_pRunnableTarget- >run(); return 0; } void CThread::start(CRunnable& runnable) { unsigned int threadId; _pRunnableTarget = &runnable; _thread = (HANDLE) _beginthreadex(NULL, 0, runnableEntry, this, 0, &threadId); } void CThread::threadCleanup() { if (!_thread) return; if (CloseHandle(_thread)) _thread = 0; } void CThread::join() { if (!_thread) return; switch (WaitForSingleObject(_thread, INFINITE)) { case WAIT_OBJECT_0: threadCleanup(); return; } } int _tmain(int argc, _TCHAR* argv[]) { CTest threadTest; CThread thread; thread.start(threadTest); thread.join(); return 0; }
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话