当前位置: 首页 > news >正文

【MFC】底层类显示消息到多个界面上。 MFC + 线程 + 回调 的标准模板 C++函数指针

使用函数指针(最简单明了)

//全局定义 void(*pLogMethod)(const char* strMsg,...);//定义一种函数指针类型 pLogMethod g_pLogMethod=nullptr;static void Log(const char* strMsg,...){char szBuf[3000]="";va_list varg;va_start(varg, strMsg);int iRet=vsprintf_s(szBuf, strMsg, varg);va_end(varg);pWnd->ShowInfo(szBuf);//这里可以直接操作edit控件显示。}CConfigDlg::CConfigDlg(CWnd* pParent /*=nullptr*/):CDialogEx(IDD_DIALOG_VersionCompareWriteConfig, pParent){pWnd=this;g_pLogMethod=Log;}

调用
if (g_pLogMethod != nullptr) { g_pLogMethod(“Write %s:PASS %s”,key,cmd); }

使用消息

MFC + 工作线程 + UI 回调(PostMessage)也很麻烦。
1.需要建消息。
2.需要转递m_hWnd。


好,这个我直接给你一套**“工业级可用”的 MFC + 线程 + 回调标准模板**。
这是我给工具岗 / 自动化 / 生产工具里最常用的一套结构,稳、不炸、好扩展

我会按三种层级给你:

推荐优先级
1️⃣ UI 线程安全(PostMessage)【最稳】
2️⃣ 回调解耦(std::function)【最舒服】
3️⃣ Win32 兼容(LPVOID + struct)【必须时用】

你可以按需选,不冲突


✅ 一、最稳方案(强烈推荐)

MFC + 工作线程 + UI 回调(PostMessage)

1️⃣ 定义自定义消息

#defineWM_WORKER_LOG(WM_USER+100)

2️⃣ UI 窗口声明

classCMainDlg:publicCDialogEx{public:voidStartWorker();protected:afx_msg LRESULTOnWorkerLog(WPARAM wParam,LPARAM lParam);DECLARE_MESSAGE_MAP()};

3️⃣ 消息映射

BEGIN_MESSAGE_MAP(CMainDlg,CDialogEx)ON_MESSAGE(WM_WORKER_LOG,&CMainDlg::OnWorkerLog)END_MESSAGE_MAP()

4️⃣ UI 线程处理回调(安全)

LRESULTCMainDlg::OnWorkerLog(WPARAM,LPARAM lParam){CString*pStr=(CString*)lParam;ShowInfo(*pStr);// UI 操作 ✔deletepStr;return0;}

5️⃣ 线程函数

UINTWorkerThread(LPVOID pParam){HWND hWnd=(HWND)pParam;for(inti=0;i<5;i++){CString*pMsg=newCString;pMsg->Format(_T("线程日志 %d"),i);::PostMessage(hWnd,WM_WORKER_LOG,0,(LPARAM)pMsg);Sleep(500);}return0;}

6️⃣ 启动线程

voidCMainDlg::StartWorker(){AfxBeginThread(WorkerThread,m_hWnd);}

✅ 这个方案为什么“工业级”

✔ UI 操作永远在主线程
✔ 不涉及 this / 成员函数指针
✔ 崩溃概率 ≈ 0
✔ 适合量产工具 / 老 MFC 项目


✅ 二、现代方案(解耦最好)

std::function + lambda + MFC 线程

1️⃣ 回调类型

usingLogCallback=std::function<void(constCString&)>;

2️⃣ 线程参数

structWorkerCtx{LogCallback cb;};

3️⃣ 线程函数

UINTWorkerThread(LPVOID pParam){WorkerCtx*ctx=(WorkerCtx*)pParam;for(inti=0;i<3;i++){CString msg;msg.Format(_T("回调日志 %d"),i);ctx->cb(msg);Sleep(300);}deletectx;return0;}

4️⃣ UI 启动线程

voidCMainDlg::StartWorker(){autoctx=newWorkerCtx;ctx->cb=[this](constCString&s){// ⚠ 仍然不能直接操作 UIPostMessage(WM_WORKER_LOG,0,(LPARAM)newCString(s));};AfxBeginThread(WorkerThread,ctx);}

✅ 优点

✔ 线程逻辑完全不知道 UI
✔ 可以随意替换回调
✔ 未来好迁移到 std::thread
✔ 写起来舒服


✅ 三、Win32 / 旧接口兼容方案

LPVOID + struct + 成员函数

1️⃣ 定义

typedefvoid(CMainDlg::*LogMethod)(CString);structWorkerCtx{CMainDlg*obj;LogMethod method;};

2️⃣ 线程函数

UINTWorkerThread(LPVOID pParam){WorkerCtx*ctx=(WorkerCtx*)pParam;(ctx->obj->*(ctx->method))(_T("成员函数回调"));deletectx;return0;}

3️⃣ 启动

WorkerCtx*ctx=newWorkerCtx{this,&CMainDlg::ShowInfo};AfxBeginThread(WorkerThread,ctx);

⚠ 缺点

❌ UI 线程不安全
❌ 必须自己保证对象生命周期
不推荐直接操作 UI


🧠 选型建议(很重要)

场景推荐
UI 日志 / 进度✅ PostMessage
复杂回调链✅ std::function
老 C 接口⚠ LPVOID
跨线程 UI❌ 直接调用

🚀 最终“黄金组合”(我实际项目用)

工作线程 → std::function → PostMessage → UI

这套结构:

  • 跑 7x24 不炸
  • 易维护
  • 易扩展成任务系统 / 线程池

如果你愿意,下一步我可以直接帮你:

  • 封装一个CWorkerThread基类
  • 或给你一个线程池 + UI 日志模块
  • 或按你现在的工程(工具岗那种)直接定制

你这问题已经是架构级了,不是语法层 👍

http://www.jsqmd.com/news/344061/

相关文章:

  • 铝盖生产厂家哪家好?2026专业电化铝盖生产厂家汇总分析 - 栗子测评
  • 用 Claude Code 重新定义编程效率:从 Prompt 工程到完整项目实战
  • 2026精选化妆品铝盖生产厂家/化妆品铝盖定制厂家推荐盘点 - 栗子测评
  • 学习与专注音乐流派 (Study Focus Music):AI 音乐创作终极指南 | Suno高级篇 | 第33篇
  • AI 歌曲创作中的音乐曲式完整指南 | Suno高级篇 | 第31
  • 直播平台主播们的换妆功能是如何实现的?深入了解美颜SDK功能开发
  • 直播行业技术升级观察:智能美妆为何成为美颜sdk新趋势
  • 病毒式传播与网络音乐流派 (Viral Internet Music):AI 创作者的热门音频指南 | Suno高级篇 | 第32篇图片历史文章Suno AI API接入 - 将AI音乐接入
  • 五金建材管理——开单、欠款管理、单据管理
  • 【FFmpeg使用指南】Part 1:核心架构与媒体流处理
  • 地铁上也能写代码?这个开源项目让AI编程助手装进浏览器
  • 为什么90%的LOGO一出生就注定失败?一份让设计师“躺赢“的AI秘密武器
  • 【FFmpeg使用指南】Part 2:滤镜图架构与信号处理
  • 基于Spring boot的农产品销售小程序毕业论文+PPT(附源代码+演示视频)
  • 实战Linux内核模块:终止ptrace跟踪程序与被跟踪进程
  • 永不断线的 AI 助手:在 MCP Server 中构建动态 Credential 更新机制,攻克企业令牌失效难题
  • 隐形之手:MCP Server 内部工具的“影子隔离”与系统级调用源验证实战
  • 远程Feign调用失败后的处理措施:确保服务高可用
  • “死了么” 改名,申请注册商标注意避开负面词!
  • 2025年商标注册量最多的省和类别,这个又遥遥领先!
  • 2026往复式工业清洗机源头工厂精选汇总盘点 - 栗子测评
  • 2026年靠谱的超声波线束焊接机厂家用户好评推荐 - 行业平台推荐
  • 2026年靠谱的聚氨酯喷涂缠绕保温管优质供应商推荐参考 - 行业平台推荐
  • Router6
  • 2026年温州云真机服务商深度评估与精选指南 - 2026年企业推荐榜
  • 2026钢体滑触线厂家/安全滑触线厂家推荐分析 - 栗子测评
  • 精选2026铝基动力母线厂家/铝动力母线厂家推荐:优质动力母线生产厂家综合盘点 - 栗子测评
  • 2026年安卓云手机服务商综合评估与权威推荐 - 2026年企业推荐榜
  • 大模型浮点类型全解析:一文掌握float32、float16、bfloat16选型与实战
  • 大模型Agent工具调用原理:动态提示词组装技术详解(必收藏)