[转]MFC子线程更改图像数据后更新主窗口图像显示方法
程序思路是由外部的输入输出控制卡发出采集图像信号,之后相机采集图像得到图像数据指针,接收图像数据指针创建成图像最后显示到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,,); //pParam就是CreateThread中传递到Dectect的窗口句柄
第七步:在第四步的函数实现部分中可以直接调用CMyDlg的OnPaint函数,Invalidate和Updatedata等函数了。
记录的自我感觉很详细,方便以后再查阅。同时欢迎各位大神多提宝贵意见。
参考文献:MFC新线程控制进度条
[转]MFC子线程更改图像数据后更新主窗口图像显示方法的更多相关文章
- vc/mfc获取rgb图像数据后动态显示及保存图片的方法
vc/mfc获取rgb图像数据后动态显示及保存图片的方法 该情况可用于视频通信中获取的位图数据回放显示或显示摄像头捕获的本地图像 第一种方法 #include<vfw.h> 加载 vfw3 ...
- MFC获取rgb图像数据后动态显示及保存图片的方法
该情况可用于视频通信中获取的位图数据回放显示或显示摄像头捕获的本地图像 第一种方法 #include<vfw.h> 加载 vfw32.lib 链接库 //---------------- ...
- [转]MFC子线程中更新控件内容的两种办法
一.概述 每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应能力.一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线 ...
- Java线程——线程习题(一)子线程执行10次后,主线程再运行5次,这样交替执行三遍
题目:子线程执行10次后,主线程再运行5次,这样交替执行三遍 代码如下: package com.itheima.gan; /** * 子线程执行10次后,主线程再运行5次,这样交替执行三遍 * @a ...
- js实现非模态窗口增加数据后刷新父窗口数据
父窗口是由两个部分组成,一个html的table,一部分是extjs的gird. 点击grid面板[增加]按钮将会弹出非模态窗口进行新数据的编辑页面 下面是按钮的触发函数代码: var a = win ...
- Laravel 5 插入数据后返回主键ID
方法一: $info = DB::table('表名')->insertGetId(['imgName' => $fileName]);//图片名入库后返回添加数据行的主键ID 方法二:( ...
- RDS for MySQL 删除数据后空间没有减少处理方法
公司的程序和数据库部署在阿里云上,数据库使用的是阿里云的RDS,这天,经理在开发群中发了一个信息: 您的RDS实例rm********0oq的磁盘在过去一周平均使用率已超过80.%,建议您对实例规格进 ...
- mybatis的插入数据后的主键获取
为什么要在插入数据后获取主键:当有一个订单表和订单详情表,当插入订单表的数据后,需要在订单详情表插入该订单的具体购物情况,订单详情表需要的一个列是订单表的主键或者订单ID.(通俗讲:A表的主键是B表的 ...
- 2019-6-23-WPF-解决弹出模态窗口关闭后,主窗口不在最前
title author date CreateTime categories WPF 解决弹出模态窗口关闭后,主窗口不在最前 lindexi 2019-06-23 11:48:38 +0800 20 ...
随机推荐
- JS 中的require 和 import 区别整理
ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...
- 一些在线开发手册api文档收藏
java JavaSE8 api:https://docs.oracle.com/javase/8/docs/api/ JavaSE7 api:http://docs.oracle.com/javas ...
- python 中str字符串 和list列表基本操作总结
s = '#afsfdf222#' print(s.capitalize()) # 首字母大写其他字母小写 print(s.center(20, '%')) # 居中并在空白处添加指定字符 print ...
- express的proxy实现前后端分离
var express = require('express') var proxy = require('http-proxy-middleware') var app = express() ap ...
- pymsql模块使用
数据库连接客户端 链接:https://pan.baidu.com/s/1pM0h4SV 密码:614v sql指令基本用法:
- idea 安装findBugs 和 checkStyle
1.fiindBugs是一款 静态分析工具,检查程序潜在bug,在bug报告中快速定位到问题的代码上.在idea下面安装很简单可以参考 http://zhongmin2012.iteye.com/bl ...
- 命令行模式(CMD)下mysql查询中文显示乱码问题
mysql的默认编码已经设置为utf-8,用其他工具(代码,mysql workbench)写入或读出时显示正常,但用cmd查询时显示为乱码. 2.原因:mysql的客户端根本无法以utf-8的形式返 ...
- ubuntu配置(娱乐工作)
因为目前没有使用ubuntu作为工作的电脑(mac还是好用),所以暂时记录一下别人分享的ubuntu常用软件: 输入法:搜狗输入法 虚拟机:virtualbox 浏览器:chromium ide:id ...
- 使用pdb调试python脚本
pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了 ...
- C++文件操作:打开文件和写入文件 zz
http://www.weixueyuan.net/view/5825.html 如果程序的运行结果仅仅显示在屏幕上,当要再次查看结果时,必须将程序重新运行一遍:而且,这个结果也不能被保留. 如果希望 ...