news 2026/6/15 17:57:30

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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 日志模块
  • 或按你现在的工程(工具岗那种)直接定制

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 15:01:24

直播平台主播们的换妆功能是如何实现的?深入了解美颜SDK功能开发

当你在直播平台刷到一位主播&#xff0c;轻点屏幕就能在“清新裸妆”“元气桃花妆”“高级冷白皮”之间自由切换时&#xff0c;很多人会下意识以为&#xff1a; “这不就是个滤镜吗&#xff1f;” 但真正做过直播系统或音视频开发的人都知道——直播换妆&#xff0c;远不只是贴…

作者头像 李华
网站建设 2026/6/15 13:14:27

【FFmpeg使用指南】Part 2:滤镜图架构与信号处理

&#x1f4da; 写给开发者的音视频处理工程手册 &#x1f3af; 目标&#xff1a;深入解析 FFmpeg 的核心引擎——滤镜图 (Filtergraph)。本章将从信号流&#xff08;Signal Flow&#xff09;的角度&#xff0c;阐述如何通过有向图&#xff08;Directed Graph&#xff09;结构实…

作者头像 李华
网站建设 2026/6/15 13:15:35

ByteDance研究突破:让AI训练像养花一样“循序渐进“成长

大型语言模型的训练一直是人工智能领域最昂贵的挑战之一。想象一下&#xff0c;每次训练一个像ChatGPT这样的AI模型&#xff0c;就像建造一座摩天大楼&#xff0c;需要投入数百万美元的计算资源和数月时间。这让很多研究团队望而却步。不过&#xff0c;来自字节跳动和北京大学的…

作者头像 李华
网站建设 2026/6/15 10:27:52

【开题答辩全过程】以 高校宿舍分配系统设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/6/5 22:55:14

蓝桥杯JAVA--启蒙之路(十二)包装类型 JavaBean

一前言今天照常更新&#xff0c;不知是不是我的内容太水&#xff0c;还是形式不好&#xff0c;或者其他原因&#xff0c;最近的阅读量直线下降&#xff0c;我是欢迎大家提供建议的&#xff0c;但无论怎样&#xff0c;我会坚持的。二主要内容包装类型我们已经知道&#xff0c;Ja…

作者头像 李华