MFC之消息传递(A->B->C, C为主窗口且没有启动)

MFC中两个不同窗口之间的数据交互 从MFC的一个窗口A控件中得到的数据要在另一个窗口B中进行显示,首先要确保控件的数据保存的变量在这两个控件中都能使用,一般建议将该变量设为全局变量。然后要将在A窗口的.CPP文件中添加显示函数即可。 1.全局变量的设定: 建议个人最好自己建立一个”Global.h”和”Global.cpp”两个头文件:       1).在”Global.h”中对变量进行变量进行声明; 阅读详情

情形一:

你希望启动一个进程A,然后希望在进程A中再启动B,并暂停当前进程A,直到进程B结束后再返回进程A?

这时就可以调用API函数WaitForSingleObject函数

注意:Linux内核其实也提供了类似的函数,可以执行进程A的同时创建B,并且以不同的顺序执行

	STARTUPINFO si;
	::ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	PROCESS_INFORMATION pi;
	if (::CreateProcess(NULL, _T("Notepad"), NULL, NULL,FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL,&si,&pi))
	{
		::CloseHandle(pi.hThread);
		::WaitForSingleObject(pi.hProcess, INFINITE);
		::CloseHandle(pi.hProcess);
	}

这里createProcess为创建进程的函数,里面参数可以自行查找,当创建成功后,先关闭了线程句柄,

注意:Window一般将对象和句柄绑定,当对象销毁的时候,句柄会随之销毁,但是需要一定时间(实际很短)

这里面我使用WaitForSingleObject阻止当前线程直到指定的对象进入信号发出状态,即是去等待线程B的结束信号,只有线程B结束的时候才会处于信号发出状态,其实也是线程A一直在阻塞状态,应该是休眠让出CPU,然后B线程去执行,直到B线程执行结束后,OS才会唤醒线程A,A线程才得以继续执行。

情形二:

如果A窗口先创建,然后在A窗口创建了B,在B窗口(有一些选项按钮)创建了C窗口(主窗口),当选择了按钮之后进入C,在C退出后如何返回到B?同时在C还没有创建前,如何由B向C发送消息呢?如下实例图:

 

例子不是使用窗口,而是进程,其实原理是想通的:这里我们可以使用函数WaitForInputIdle函数

	STARTUPINFO si;
	::ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	PROCESS_INFORMATION pi;
	if (::CreateProcess(NULL, _T("Notepad"), NULL, NULL,FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL,&si,&pi))
	{
		::CloseHandle(pi.hThread);
		//::WaitForSingleObject(pi.hProcess, INFINITE);
		WaitForInputIdle(pi.hProcess, INFINITE)
		::CloseHandle(pi.hProcess);
	}

这里面设线程A、B,WaitForInputIdle直到线程B开始处理消息并清空消息队列,才会执行当前线程A;

试想上面的情况:如果A创建了B窗口,当然AB都是C的子窗口,MFC默认一般要有一个主窗口,可以进行消息的发送,这样消息会自动传递到主窗口,这里我们就可以进行消息的传递,A可以使用也可以不使用,假设B使用消息传递到C,这时候我们就可以使用上面类似的函数进行处理。这里面是进程,因为上面窗口创建的时候可以使用线程

题外话:当然你可以指定窗口句柄,发送到任意窗口,其实窗口的东西的很乱,你需要获得好多东西,还需要转换,像Linux那种界面内核分离的机制就很好,不用关心太多界面的东西

情形三:

当执行一个大量在主线程执行的任务,这时候主线程可能会出现假死,如果在主线程响应主任务的同时,又可以响应用户的操作呢?

这里面说的就是消息泵,我们知道在MFC有钩子,就是在事件在到达消息循环处理队列之前(消息被分派到Windows函数TranslateMessage和DispatchMessage之前过滤窗口消息)就被处理了,然后可以清除队列了,同样我们可以在主函数无法响应的处理函数里面添加一个消息处理函数

如下函数:

	MSG msg;
	while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
	{
		if (!AfxGetApp()->PumpMessage())
		{
			::PostQuitMessage(0);
			return FALSE;
		}
	}

	long lIdel = 0;
	while (AfxGetApp()->OnIdle(lIdel++));

	return TRUE;

PeekMessage 从消息队列里面取出消息,放入msg结构,跟GetMessage有些不同,不会等待消息放入队列才返回,就是说空队列会直接返回。

PumpMessage 包含线程的消息循环,由CWinThread 调用发送线程的消息,可以直接调用PumpMessage 强制消息处理,处理失败就发送退出消息。

C++窗口编程实战:从Win32消息循环到跨进程嵌入与多线程UI 在Windows桌面开发中,图形用户界面(GUI)编程是构建交互式应用的核心。其底层原理基于事件驱动模型,通过消息循环机制实现用户输入与界面响应的解耦。这一机制的技术价值在于提供了高效、异步的UI交互基础,是Windows平台所有GUI框架(如MFC、Qt)的基石。在工程实践中,开发者常需处理复杂的应用场景,例如实现插件化架构时的跨进程窗口嵌入,或为保持界面流畅而引入的多线程后台任务。针对“c++ qt 窗口跨进程嵌入到chrome官方浏览器后 按钮无法点击”这类典型问题,其根源在于Windows的消息传递 阅读详情

相关推荐

VC++多线程聊天室实战:WinSock网络编程与线程同步详解

网络编程是构建分布式系统的核心技术,其核心在于实现不同主机间的进程通信。TCP/IP协议栈提供了可靠的字节流传输服务,而Socket API则是操作系统提供的网络编程接口,开发者通过调用Socket函数创建连接、发送和接收数据。在Windows平台下,WinSock API是实现网络通信的基础,理解其阻塞与非阻塞模式、select模型等概念对掌握高性能服务器开发至关重要。多线程技术能够有效提升程序的并发处理能力,通过为每个客户端连接创建独立线程,可以实现同时服务多个用户的需求。然而,多线程环境下共享资源的访

weixin_30411819的博客 396

子窗口向父窗口发消息

<br />在MFC中,使用用户自定义消息,子窗口向父窗口发送消息过程、代码:<br />1)在config.h中增加定义:<br /> #define WM_add_event_ok (WM_USER + 100) <br />2)在父窗口的.h文件中,增加定义:<br />protected:<br />afx_msg LRESULT Onadd_event_ok(WPARAM wParam, LPARAM lParam);<br />两个参数:WPARAM wParam, LPARAM lParam类

jjccwwbb的专栏 2238

Qt QTableWidget的使用方式

//QTableWidget行选中/删除/添加行 //1 均分各列 tableWidget->horizontalHeader()->setStretchLastSection(true); //就是这个地方 tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch); //2 整行选中:job_

行者 1万+

消息队列实现简单即时通信(纯属娱乐)

声明: 仅个人小记 前言:  进程间通信的方式之一,消息队列机制。消息队列就是存活在内核中(就是操作系统中)的由消息构成的链表。我们通过指定一个键值(键值由我们自己设定),键值可以映射成一个固定的消息队列描述符。进程之间,借助消息队列描述符实现通信。就是由内核作为中间人,负责消息的暂存。消息队列中的各个消息之间相互独立,添加消息或者读取消息都是按个数写入或者读取,不会发生一个消息只被读取

Zetaa的博客 3974

二叉树先序遍历的非递归算法

在前面一文,说过二叉树的递归遍历算法(二叉树先根(先序)遍历的改进 ),此文主要讲二叉树的非递归算法,采用栈结构 总结先根遍历得到的非递归算法思想如下: 1)入栈,主要是先头结点入栈,然后visit此结点 2)while,循环遍历当前结点,直至左孩子没有结点 3)if结点的右孩子为真,转入1)继续遍历,否则退出当前结点转入父母结点遍历转入1) 先看符合此思想的算法: int PreO

行者 1万+

C++中如何声明 “友元类” 和 “友元函数”

调试平台:win7 vs2012 win32控制台终端项目 友元(friend) 字面义:顾名思义既然是朋友了,我的东西同样可以给你使用 书面语:将一个类的非公有成员(包括方法和成员变量)的访问权限赋予指定的类或者指定的函数 关键字为:friend 类原型/函数原型(包含域) 1.将类声明为友元,看下面例子 注意:这里使用两个文件,每个类占用一个文件,调试有其他类(只保留跟这个有关的)

行者 7431

子窗口和父窗口的消息传递

转至:http://hi.baidu.com/tiancao222/item/d2f0dc370617dff3e6bb7a61 一、 概念:         1. 什么是窗口        2. 什么是消息        3. 什么是窗口过程函数        4. 怎么创建窗口        5. 消息是怎么传递并处理的        二、 方法:        用调用windo

周翔的专栏 6096

2022-8-3----Android10.0(MTK)-----SN_Writer 写入 SN 注意事项

SN_Writer、写入SN

qq_854189624的博客 1万+

MFC子父窗口发送消息

1. 插入新对话框,并建立新类,注意Base Class要选CDialog;   2. 在新生成类的.cpp文件中,include主对话框的头文件: #include "PCRProjectDlg.h"       // 主窗口类的头文件   3. 在父窗口的.h文件中, 3.1 include子窗口的头文件: #include "ParsaveDlg.h"        // 新添

phenixyf的专栏 4558

自动驾驶仿真(五)—— 基于Carsim、Prescan、Simulink的联合仿真

自动驾驶仿真五——基于Carsim、Prescan、Simulink的联合仿真1. 联合仿真流程2. CarSim联合仿真配置要点3. Prescan联合仿真配置要点4. Carsim、Prescan、Simulink联合仿真结果5. 参考学习的书目教材 博主前面的博文已经介绍了Carsim和Prescan各自与Matlab/Simulink的相关联合仿真应用实例,并且论述过几款软件各自的优势及用法,CarSim适合动力学模型的建立,PreScan适合行车场景的搭建,Simulink适合控制算法的设计及信号

zhudj08的博客 1万+

在VM虚拟机的MobaXterm下安装JDK17

本文介绍了在Linux系统下安装配置JDK17的完整步骤:1)从Oracle或OpenJDK官网下载Linux版JDK17压缩包;2)上传至/usr/local目录;3)解压安装包;4)通过编辑/etc/profile文件配置环境变量,添加JAVA_HOME和PATH路径;5)使用source命令使配置生效;6)通过javac -version验证安装是否成功。整个过程涵盖了从下载到环境配置的完整流程,确保Java开发环境正确设置。

qq_2937655951的博客 442

窗口消息的传递

声明:本文非本人所写,本文已经写在本人优快云博客里。本原来源于一篇英文文章的翻译。         消息(Message)是窗口间通信的最重要的方式之一。传统的程序从main()函数处开始一行一行的执行直到退出,但是窗口的概念则不同。窗口对事件(event)进行响应,这种事件称为消息。事件由程序本身、其他程序或系统程序产生,这些事件又产生消息。鼠标移动、按键等都会产生事件。消息分为两种即窗

wt8220321的专栏 1245

从充电管理芯片里‘偷师’:拆解一个PMOS双向开关电路,搞定你的固态继电器需求

本文深入解析了PMOS双向开关电路在固态继电器应用中的设计要点,重点探讨了防电流倒灌和高侧双向开关的实现技巧。通过拆解充电管理芯片中的PMOS背靠背结构,工程师可以构建高效可靠的固态开关方案,适用于智能硬件和电池管理系统。文章还提供了关键参数选择、电路优化建议及实测数据对比,助力解决电源防反接等工程难题。

weixin_33698043的博客 487

【前端】A窗口弹出B窗口,B窗口弹出C窗口,C如何和A窗口通信

【前端】A窗口弹出B窗口,B窗口弹出C窗口,C如何和A窗口通信

相信并热爱着 1880

WPF实战:利用Live Charts实现高性能动态曲线可视化

本文详细介绍了如何在WPF中使用Live Charts实现高性能动态曲线可视化,特别适用于工业监控和金融分析等实时数据场景。通过增量渲染、内存复用和硬件加速等核心技术,Live Charts能够高效处理高频数据更新,显著提升图表流畅度。文章提供了从基础实现到工业级优化的完整解决方案,帮助开发者应对各种性能挑战。

weixin_29189373的博客 408

CH341的I2C流模式(StreamI2C)到底怎么用?从EEPROM读写到自定义设备,一篇讲清参数配置逻辑

本文详细解析了CH341的I2C流模式(StreamI2C)的使用方法,从EEPROM读写到自定义设备的参数配置逻辑。通过深入分析I2C协议基础、StreamI2C参数映射关系及典型设备配置示例,帮助开发者快速掌握StreamI2C的应用技巧,解决实际开发中的常见问题。

weixin_30932215的博客 452

VC/MFC开发中的句柄HWND

Windows开发中,经常会碰到一个常见的字眼HWND,如下 HWND hWnd; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);HW

行者 5507

03 Token、Embedding、上下文窗口:开发者必须懂的三个基本概念

Token、Embedding 和上下文窗口是大模型应用开发的三个基础概念。本文从成本、速度、检索和上下文设计四个角度讲清它们的工程意义,帮助开发者理解为什么同一段内容会超限、变贵,为什么 RAG 能做语义检索。

老于的笔记的专栏 413

C++队列模板使用std::queue

#ifndef _TASK_QUEUE_H_ #define _TASK_QUEUE_H_ #include #include #include template class TaskQueue { public: TaskQueue(){ queue_.clear(); } virtual ~TaskQueue(

行者 5199

面向业务角色的 SAP Fiori Space 与 Page 创建全流程实战指南

业务角色导航设计:从Space与Page规划到实施 摘要:本文探讨了SAP S/4HANA Cloud和BTP ABAP环境中基于业务角色的导航设计方法。传统Fiori Launchpad的Group+Tile模式存在应用堆积问题,而新的Space与Page模型将导航按工作领域(如应付会计、销售代表)组织,每个Space包含多个任务导向的Page。文章详细介绍了从业务角色建模到Space/Page创建、分配的完整流程,包括核心概念解析、规划思路和具体操作步骤。重点阐述了如何根据业务需求选择创建方式(基于预交

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 187

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: u-boot镜像Image中有关结构体
下一篇: MFC中连接SQL Server的方法
comwise
博客等级 码龄15年 58粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值