程序思路是由外部的输入输出控制卡发出采集图像信号,之后相机采集图像得到图像数据指针,接收图像数据指针创建成图像最后显示到MFC对话框应用程序的Picture Control控件上,同时,为了标定相机位置,在主对话框类CMyDlg的OnPaint函数中有对Picture Control的绘图操作(不改变图像数据,进行画线,画矩形等操作)。

设计时考虑到I/O卡何时发出采集信号或者相机何时得到图像数据指针是不确定的(不使用OnTime),同时考虑到I/O卡和相机的回调函数与主程序之间的数据交换会更加困难(不在回调函数里处理结果),所以创建多线程Dectect函数,I/O卡或者相机的回调函数仅负责向主程序发送全局的图像数据指针,调用自定义事件的SetEvent函数通知Dectect线程工作。

Dectect线程获得图像数据指针之后无法直接调用CMyDlg的OnPaint函数,Invalidate和Updatedata等函数。

采用自定义消息的方式间接实现功能。将来在工作中肯定会遇到更多的此类情况。实现分为下列七个步骤。

第一步:在stdafx.h增加一个自定义消息宏

#define WM_USER_POSTINVALIDATE WM_USER+500  

第二步:在MyDlg.h中声明一个public类型的成员函数(声明我们自己定义消息的处理函数)

afx_msg LRESULT MyMessage(WPARAM wParam, LPARAM lParam);  

第三步:在CMyDlg类(MyDlg.cpp)的 BEGIN_MESSAGE_MAP(CEE8000Dlg, CDialog) 和 END_MESSAGE_MAP()之间(即类的消息映射表)中添加自定义消息的映射项

ON_MESSAGE(WM_USER_POSTINVALIDATE,MyMessage)  

第四步:在CMyDlg类的实现文件MyDlg.cpp中添加自定义消息的处理函数

LRESULT CMyDlg::MyMessage(WPARAM wParam, LPARAM lParam)
{   } 

第五步:之前操作增加的自定义消息函数的目的是为了可以在Dectect线程中调用PostMessage函数,PostMessage作用是将一个指定的消息寄送到指定窗口创建的线程(窗口句柄)的消息队列中。消息已有,接下来需要在Dectect中获得主对话框的窗口句柄。
1、得到主对话框的窗口句柄。常规问题,在CMyDlg的OnInitDialog函数中添加

CWnd *pMainWnd=AfxGetMainWnd();
HWND hMainWnd=pMainWnd->GetSafeHwnd();  

2、将hMainWnd添加到Dectect。比较麻烦,初始尝试把hMainWnd定义成全局变量,调试运行发现hMainWnd在OnInitDialog中正确赋值,运行到Dectect线程函数值就又变为NULL。还尝试在Dectect函数中

CWnd *pMainWnd=AfxGetMainWnd();             //错误方法
HWND hMainWnd=pMainWnd->GetSafeHwnd();      //错误方法  

调试结果运行到Dectect线程函数hMainWnd就又变为NULL。正确的方法又要回到Dectect线程的创建过程中去。

3、Dectect线程创建函数

HANDLE hThreadDectect=CreateThread(NULL,NULL,&Dectect,NULL,NULL,&dwThreadId1);      //错误方法

修改后的Dectect线程创建函数

HANDLE hThreadDectect=CreateThread(NULL,NULL,&Dectect,hMainWnd,NULL,&dwThreadId1);//正确,第四个参数将hMain作为参数传入回调函数

经过这样3步就将主对话框的窗口句柄传递到Dectect线程中了。

第六步:Dectect线程图像数据处理操作完成之后向主对话框线程寄送完成消息,我的程序中相当于通知主对话框进行重绘操作。Dectect线程函数的合适位置:

PostMessage((HWND)pParam,WM_USER_POSTINVALIDATE,0,0);     //pParam就是CreateThread中传递到Dectect的窗口句柄  

第七步:在第四步的函数实现部分中可以直接调用CMyDlg的OnPaint函数,Invalidate和Updatedata等函数了。

记录的自我感觉很详细,方便以后再查阅。同时欢迎各位大神多提宝贵意见。

原文链接:MFC子线程更改图像数据后更新主窗口图像显示方法

参考文献:MFC新线程控制进度条

[转]MFC子线程更改图像数据后更新主窗口图像显示方法相关推荐

  1. ios开发,将子线程获取的数据实时更新到UI

    多线程编程中普遍遵循一个原则,就是一切与UI相关的操作都有主线程做,子线程只负责事务,数据方面的处理. 所以不能直接在子线程中调用主线程的类的更新UI的方法,这样看不到任何结果. 而是需要有个缓冲,切 ...

  2. Mybatis插入数据后获取主键的值

    Mybatis插入数据后获取主键的值 1. 所使用的数据库是支持自增的,且主键是自增的 <!-- 支持自增的数据库且主键是自增的:自动将插入后自增id的值赋值给传入的Employee的id--& ...

  3. MFC子线程访问主线程对话框程序的控件对象

    最近在使用 VC 开发软件时需要用到多线程同步来解决开发过程中遇到的问题.本来以为只要象控制台程序一样,在主线程创建子线程,并设置好相应的对象事件就能解决问题,但是等到真正做起来,才在实践中发现原来事 ...

  4. MySQL 学习笔记(4)— 组合查询、子查询、插入数据、更新/删除表数据、增加/删除表中的列以及重命名表

    1. 组合查询 1.表的加减法 表的加法,即求 product 和 product2 的并集,UNION 运算会除去重复的记录 SELECT product_id, product_name FROM ...

  5. python主线程和子线程_python 在threading中如何处理主进程和子线程的关系

    之前用python的多线程,总是处理不好进程和线程之间的关系.后来发现了join和setDaemon函数,才终于弄明白.下面总结一下. 1.使用join函数后,主进程会在调用join的地方等待子线程结 ...

  6. MYSQL插入数据后返回主键

    最近做项目,要求不能使用mybatis等框架,所以一切数据库访问操作都是用原生的JDBC. 用过mybatis的都知道,插入新数据后可以直接返回主键的值,但是使用JDBC不行,于是上网搜了一下,找到一 ...

  7. MFC子线程中调用updatedata()函数报错解决方法

    在XXXDlg.h顶部添加 #define WM_UPDATEDATA WM_USER+100 关联自定义消息,在XXXDlg.cpp中消息处理函数中添加 ON_MESSAGE(WM_UPDATEDA ...

  8. ie8/9收到json数据后提示下载的解决方法

    使用fineuploader上传文件,收到处理程序的返回结果为json数据,在google和ie10及以上没有问题,但在ie8.ie9下提示下载json,为避免出现提示下载框, 修改文件Global. ...

  9. 19 Handler 子线程向主线程发送信息

    案例一 Message创建三种方法: package com.example.day19_handler_demo1;import android.os.Bundle; import android. ...

最新文章

  1. 原来评分卡模型的概率是这么校准的!
  2. 计算机视觉与深度学习 | 基于边缘与形态学的细胞检测
  3. php 删除某个文件夹,Php删除指定文件与文件夹的方法
  4. 按压缩格式整理打包(解包)和压缩(解压)命令
  5. ubuntu下C编程,编译基础( 转)
  6. hibernate基于单表curd
  7. input最大长度限制问题
  8. jsf取js变量_javascript中如何获取jsf后台数据?
  9. 动态设置imageview 宽高
  10. python人脸照片分类_Python系列之三——人脸检测、人脸识别
  11. matlab yalmip cplex,关于 cplex+matlab+yalmip问题
  12. 锐捷、赛尔认证MentoHUST
  13. Typora+PciGo-Core+SMMS自动上传图片
  14. Halcon实战 项目二 Bolb实战分析-提取图片中的硬币
  15. 面向在校学生的谷歌编程实习项目(GSoC2021)
  16. python 网络通讯 plc_Python TCP通信网络编程
  17. 基于FPGA的频率计设计
  18. 《从两月失败职场经历看内部创业四大弊病》有感
  19. 非常详细的SIP协议总结
  20. winForm开发问题,vs的bug,Datagridview始终不能编辑!

热门文章

  1. 同济保研计算机,同济大学保研率28%,保研高校前四:复旦、北大、交大、清华...
  2. linux三剑客应用到工作中,LINUX 三剑客老大(AWK) 日常工作总结(示例代码)
  3. mysql删除注册表mysqld要删除吗_原神官方删除魈的观测枢数据,又要拆分机制吗?策划应该不傻吧?...
  4. 三星笔记本电脑怎么恢复出厂设置_Mac OS如何恢复出厂设置?安装Mac OS系统教程...
  5. android学生管理实例,学生管理系统-基于SQLite数据库的Android应用
  6. java毕设可以用结构化方法吗,php,java,jsp网络留言薄,怎么实现一个网络留言簿好毕设指导轻松完成...
  7. jquery.validator验证后ajax提交出现错误解决
  8. OFFICE EXCEL表格中让A1 中的数字为变量时,如何引用
  9. VB UTF-8 URL编码函数
  10. 亚马逊自动驾驶小车上线啦:才卖1700元,请叫它“强化学习玩具”