No MFC 编程05 - 进程 > 线程 > 消息队列,三者的包含关系

【MFC】PeekMessage() 与GetMessage() 消息函数 01、目录 目录01、目录02、简言03、PeekMessage() Function3.1 语法(Syntax)3.2 参数(Parameters)3.3 返回值(Return value)04、GetMessage() Function4.1 语法(Syntax)4.2 参数(Parameters)4.3 返回值(Return value)05、示例助教06、总结 02、简言 想必了解过MFC(windows程序)的都知道,windows的程序全是由消息驱动的。不敢干什么,都是通过各种各样的消息来做一些 阅读详情


    (以下内容对于初入门的人是不能或缺的)

    进程和线程,线程和消息队列,他们之间确实是有包含的关系。  如果让我按大小排序,我会排成象题目的那样。( 不过大概有人会说,消息队列怎么能跟进程、线程混为一谈呢?)

    简单的来说,什么是进程?什么是线程?打个比方,你的程序要执行,操作系统就会把你的 exe 文件加载到内存中,那就生成一个进程了(当然还包含分配到的资源等); 对于线程,你可以理解成是一个程序里的不同部分,这有点类似函数,所不同的是各个线程是同时执行的。  例如,你的主线程创建了另一个副线程,那么这两个线程是同时在工作的,不存在 调用 - 返回 的概念。  一个进程里可以有多个线程在执行,称为执行实例。

    根据我的理解,进程应该是比较大的概念, 一个进程开始时至少会有一个主线程 ( 即主执行实例 ) ,这是在系统加载你的程序的时候所创建的主执行流程。一般对外部来说只能看到进程,例如在 Win2000 的任务管理器里面查看到的只有进程 ( Process ) 而已。

    用 Ctrl + Shift + ESC 可以在 Win2000 里调出任务管理器。

    而消息队列则是与线程 ( Thread ) 相关的,换句话说,一个线程只能有一个消息队列 ( queue ) 与之相对应。   这跟之前说的有点不同,一个进程里面可以有多个线程;但是一线程里面就不能超出一个消息队列 ( Win98 里面甚至可以没有消息队列 )。

    消息队列是在什么时候生成的呢? 在 Win2000 里面,从一开始创建线程就已经有了。( 在 Win98 里,我估计是在创建过窗口之后,留给你去证实 )

    说了半天,可能一些刚入门的朋友还不知道什么是消息队列呢?  其实,Windows 操作系统是一个基于事件驱动的系统。它把握诸如鼠标,键盘输入等东西化为事件代号,发送到你的程序的消息队列里面去,你的程序则每次提取一个事件,根据事件的性质执行相应的操作,不断循环而已。

    微软提倡编程人员使用事件驱动的编程方法。    你也可以向自己线程的消息队列里发送假消息,自己骗自己也是可以的 ( 虚伪 ) !使用 PostThreadMessage 函数即可。

    编出多线程的程序其实并不难,难点其实在于线程同步  ( 线程间协调工作 ),下面的源程序正是为了简单介绍多线程编程的。
    ( 阅读的时候不要忘了主线程的入口是 WinMain 函数 )

 

  //  File Name:  WinMain.cpp


 #define WIN32_LEAN_AND_MEAN   // Say No to MFC !!

  #include <windows.h>


   char Temp[77] = "";

 

 //  我自定义的新线程入口 MyThread 函数
DWORD WINAPI    MyThread( LPVOID lpParameter )
{
   long  ThrVal = 1 ;

   for (ThrVal = 1; ThrVal < 16; ThrVal++ )
   {
   wsprintf( Temp , "这是副线程第 %ld 次显示" , ThrVal );
   MessageBox( NULL, Temp, "第二线程内容      __CopyRight - `海风 ", MB_OK | MB_TOPMOST );
   }

   return 1 ;

} // 副线程结束
 

 

// Name: WinMain()  主线程的入口
// ------ ---------- ----------- ---------
int WINAPI WinMain( HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow )
{


   DWORD   dwThreadId, dwMyThrdParam = 1;  // 第一个参数是新线程的 ID 号,第二个参数略
   HANDLE  hThread;                        // 副线程的 handle

  // 调用函数创建新的线程,新线程入口是 MyThread 函数
   hThread = CreateThread(  NULL,                  // 没有 (或默认) 的属性
                                         0,                         // 使用默认堆栈大小
                                         MyThread,            // 我的线程入口函数
                                        &dwMyThrdParam,    // argument to thread function
                                        0,                              // 使用默认 creation flags
                                       &dwThreadId);           // Win98 里不能省略


   // 已经创建了新的副线程

  MessageBox( NULL, "已经创建了新的副线程、/n"
                                 "  按确定结束主线程!", "主线程信息显示      __CopyRight - `海风 ", MB_OK | MB_TOPMOST );


    ExitProcess(0);
    return NULL;
   }

 

 


     如果说消息队列只有一个(在一个线程内),那么消息队列可以容纳多少条消息呢?我编程序去验证了一下:

 

  //  File Name:  WinMain.cpp

 #define WIN32_LEAN_AND_MEAN   // Say No to MFC !!

  #include <windows.h>

 

 char Temp[77]="Hello world";

 


// Name: WinMain()
// ------ ---------- ----------- ---------
int WINAPI WinMain( HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow )
{


  MessageBox( NULL, "按确定开始测试", "Simple_Code      __CopyRight - `海风 ", MB_OK | MB_TOPMOST );

   //  以上的一句请使用 Win98 的朋友别删除,因为在调用过创建窗口之类的函数后,你的线程才具有消息队列!

   DWORD CurThreadID = GetCurrentThreadId( ); // 取得当前线程的 ID (标识号)

   long i = 1 ;
    for ( i = 1; i < 900000; i++)
    {
       if (! PostThreadMessage( CurThreadID, WM_USER , 11, 22 ) ) break;
       // 上面的一句是如果不能再添加消息就打断 for 循环
    }
     
   wsprintf (Temp, "具体的消息队列长度是 %ld ", i);

   MessageBox( NULL, Temp, "Sample_Code      __CopyRight - `海风 ", MB_OK | MB_TOPMOST );

    ExitProcess(0);
    return NULL;
   }

 

 

 

 

   显示的结果是: 10000 ,有那么大么?!我也有点不太相信。

   如果 10000 都还不够用,那么会怎样? 哎,当然是丢失了!

 

    为了证明 消息队列 是 线程 的附属品,我查看了 MSDN ,最后在 PostThreadMessage() 函数的第一个参数解释那里找到证据,原文如下:

     " The function fails if the specified thread does not have a message queue. The system creates a thread's message queue when the thread makes its first call to one of the Win32 User or GDI functions. For more information, see the Remarks section.  "

     含义大概是,当一个线程里面第一次调用 Win32 User 类函数 (或 图形界面类 函数) 的时候,系统会为该线程创建一个消息队列,否则就没有 消息队列。

    不过,这个说法我认为在 Win2000 里面是不适用的,其实在系统创建线程的同时就创建了一个相关消息队列 (默认操作)。

    我尝试过没有调用任何其他函数的情况下也可以成功发送 消息 到 队列。

    这个由系统维护的消息队列也挺自动化的!    举个简单例子是系统会自动调整 WM_PAINT 消息的数量使之不会重复;   更复杂一点的例子是你向线程里的一个窗口发送消息,然后 Destroy 那个窗口,最后才检测消息队列。   系统会认为那个窗口已经不存在而将与那窗口相关的多余消息一并 删除掉了,所以你一定没法在消息队列里找到先前你发送的那条消息。


    好了,说太多怕打乱你的思路了,详细资料请参看 MSDN . 请在 MSDN 的索引一栏输入 " message queues [Win32] "


   下次有时间我会详细说明一下消息泵这玩艺!  `海风   2002年10月12日 pm 2:28 

——————————————————————————
附 Temp77 来历:

    人生于世上匆匆,不过相当一个临时变量,因为我出生于 77 年,所以取名 Temp77 !

目前喜欢的歌:  久保田利伸 - Never Turn Back

 

利用消息队列实现进程间通信 利用消息队列基本函数,实现Linux系统下进程A和进程B之间的消息收发。 msgsend输入‘end’,退出程序 立即下载

相关推荐

彻底解决Win11 Android模拟器驱动权限问题:手动修改silent_install.bat的保姆级教程

本文提供了一份详细的Win11 Android模拟器驱动权限问题解决方案,重点介绍了手动修改silent_install.bat脚本的两种方法。通过分析问题根源并给出具体代码修改方案,帮助开发者彻底解决Android Studio在Windows 11上安装时遇到的UAC循环弹窗问题,确保android-emulator-hypervisor-driver顺利安装。

dengliugong3918的博客 461

常用6种消息队列介绍和对比

消息队列是分布式应用间交换信息的重要组件,消息队列可驻留在内存或磁盘上, 队列可以存储消息直到它们被应用程序读走。 通过消息队列,应用程序可以在不知道彼此位置的情况下独立处理消息,或者在处理消息前不需要等待接收此消息。 所以消息队列可以解决应用解耦、异步消息、流量削锋等问题,是实现高性能、高可用、可伸缩和最终一致性架构中不可以或缺的一环。 现在比较常见的消息队列产品主要有ActiveMQ、R...

徐泗空的博客 2万+

保姆级教程:手把手教你为裕泰微YT8521 PHY芯片编写Linux设备树(DTS)节点与驱动

本文提供了一份详细的保姆级教程,手把手教你为裕泰微YT8521 PHY芯片编写Linux设备树(DTS)节点与驱动。从基础配置到RGMII接口的特殊设置,再到驱动开发的关键步骤和调试技巧,帮助开发者快速掌握PHY芯片的移植与开发。

weixin_33734785的博客 333

进程间通信之---消息队列

目录 消息队列 1.消息队列的原理 2.消息队列的接口: 2.1创建消息队列 2.2向消息队列发送消息 2.3接收消息: 2.4操作消息队列的接口 2.5代码测试: 信号量: 信号量的原理 消息队列 1.消息队列的原理 1.1 msgqueue采用链表来实现消息队列, 该链表是由系统内核维护, 1.2 系统中可能有很多的msgqueue, 每个MQ用消息队列描述符(消息队列ID: qid) 来区分,qid是唯一 的,用来区分不同的MQ..

weixin_45897952的博客 3971

1.深入浅出:理解三极管截止、放大和饱和状态!——参考《模拟电子技术基础》清华大学华成英主讲

幼儿园水平理解三极管截止、放大和饱和状态!书上看不懂,听课听不懂的过来! 绕不开的三极管结构 以NPN为例,晶体三极管的结构,这是很多人不想看的,但是确实是非常重要的!不看结构是理解不了工作原理的! (这样记忆:N是negative,负,代表多子为电子;P是positive,正,代表多子为空穴) 注意观察三极管的结构,有助于理解工作时的状态。 两张图结合起来看,略作解释: 1.图中空心为空穴带正...

Hardware_harder的博客 4万+

mmdetection 实战:基于Mask R-CNN与自定义COCO数据集的目标检测全流程解析

本文详细解析了如何使用mmdetection框架和Mask R-CNN模型,基于自定义COCO数据集完成目标检测任务的全流程。内容涵盖环境搭建、数据格式转换、配置文件定制化、模型训练与评估等核心步骤,并提供了针对工业缺陷检测场景的实用调优思路与避坑指南,帮助开发者高效构建高性能检测模型。

weixin_29046611的博客 136

学习笔记——进程间通信之消息队列详解

敲黑板!!! 消息队列,是消息的链接表,存放在内核中,是在消息的传输过程中保存消息的容器。。一个消息队列由一个标识符(即队列ID)来标识。 消息队列 特点 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。 看个图 在这里不用去管Linux内核如何去操作,我们需要关心在一次收发消息中,A如果发送消息的,同时又

打不倒的程序猿 2332

ArcGIS Pro2.5深度学习使用注意事项

ArcGIS Pro2.5深度学习使用中的注意事项1、ArcGIS Pro2.5深度学习使用中的注意事项1.1、Label深度学习样本工具参数介绍1.2、准备数据参数介绍1.3、训练模型介绍1.4、ArcGIS Pro2.5深度学习推理工具和模型对应关系介绍1.4.1、Classify Objects Using Deep Learning1.4.2、Classify Pixels Using D...

GIS哼哈哈的博客 7200

Linux进程通信——消息队列

Linux进程通信——消息队列接收,发送的分别实现及夫妻进程发送消息的综合实现。了解函数流程及key值使用

嵌入式小白 记录学习过程 1558

【YOLO11[基础]】分类任务的热力图可视化实践 | 论文必备 | 分类任务 | 即插即用 | 可选GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiR

【YOLO11[基础]】分类任务的热力图可视化实践 | 论文必备 | 分类任务 | 即插即用 | 可选GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM等

静谧、淡雅 2389

后台管理系统-7-vue3之引入配置文件baseURL

mock=false,本地模拟。mock=true,线上模拟。baseURL+url=实际请求的URL。get请求param参数,post请求data参数。

qq_20466211的博客 207

进程通信——消息队列

消息队列称为报文队列也叫做信箱,是linux的一种通信机制这种通信机制传递的数据具有某种结构,而不是简单的字节流。消息队列的本质是内核提供的链表,内核基于这个链表,实现了一个数据结构。内核又基于此提供了从一个进程向另一个进程发送一块数据的方法向消息队列写数据,实际上是向这个数据结构中插入一个新节点;从消息队列读数据,实际上是从这个数据结构中删除一个节点。消息队列也有管道一样的不足,就是每个数据块的最大长度是有限的,系统上全体队列的最大值也有一个上限。

lzg_na的博客 2296

AutoSar实战营 - 总目录

欢迎大家来学习《AutoSar实战营》专栏,该篇为总目录,方便以后大家直接进入需要学习的文章。 ~正所谓独乐乐不如众乐乐 - - ~1, AutoSar之DaVinci开发环境2,BswM模块之Ecu State Handling1)读写DID功能 《AutoSar实战》读写DID之一:CDD准备 《AutoSar实战》读写DID之二:工具链配置 《AutoSar实战》读写DID之三:代码实现2)功能寻址 《AutoSar实战》禁止功能寻址

weixin_48498880的博客 3626

MFC 以及多线程初探

这两天接到任务说要用VC写个多线程,以前基本没有写过MFC的我当时的表情是这样的: 然后我去lib借了两坨书,开始写。(决心分隔线) 基本准备: 1. 怕自己智商捉急,随手的东西还是要记一下,VS快捷键调整,包括自己知识的传送门: http://jingyan.baidu.com/article/9158e0006e10d8a254122826.html 代码补全快捷键修改key wo

咕嘟咕嘟 485

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深度学习工具包 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")

mfc 如何结束某一进程_LinuxC编程 / 几个进程&线程相关的基础概念

#干了这碗鸡汤!我急切地盼望着可以经历一场放纵的快乐,纵使巨大的悲哀将接踵而至,我也在所不惜。-- 太宰治 《人间失格》大家好,这里是周日凌晨4点,仍在笔耕不辍的程序喵大人。下面隆重推出我呕心沥血,耗时半个月完成的精心力作:01什么是进程?标准定义:进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行程序的实例,包括程序计数器、寄存器和程序变量的当前...

weixin_39693971的博客 263

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

多线程编程——MFC的多线程开发

 参考文献:http://www.vckbase.com/document/viewdoc/?id=1706http://blog.youkuaiyun.com/lesky/archive/2008/05/29/2494428.aspxhttp://msdn.microsoft.com/zh-cn/library/b807sta6(VS.80).aspx MFC中有两类线程,分别称之为

路径的专栏 1099

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MFC多线程

MFC多线程 分类:C/C++2013-05-31 23:33256人阅读评论(0)收藏举报 MFC多线程 (一) MFC对多线程编程的支持  MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。   工作者线程没有消息机制,通常用来执行后台计算...

weixin_30820151的博客 90

MFC 多线程总结

MFC 多线程总结 分类: C/C++2008-05-29 19:51 24901人阅读 评论(14) 收藏 举报 mfc多线程attributesnull工作semaphore (一) MFC对多线程编程的支持               MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列

autumn20080101的专栏 877

GUI为什么不设计为多线程

在我们这批新人转正评审的时候,我师父问了我的小伙伴一个问题:为什么一些更新界面的方法只能在主线程中调用?师父没有问我这个问题,让知其然但不知其所以然的我有种侥幸逃过一难的心情。我想如果回答那是因为AndroidGUI库是单线程消息机制的,更新界面的操作必须放到主线程中执行,那师父可能继续问为什么AndroidGUI要设计成单线程的,我就不知道了。 为什么它非得设计为单线程的?多线程不是更好吗

liuqiaoyu080512的专栏 7682

MFC消息响应机制分析

http://www.cnblogs.com/dsky/archive/2012/05/28/2520853.html   1.引言 ---- VC++的MFC类库实际上是Windows下C++编程的一套最为流行的类库。MFC的框架结构大大方便了程序员的编程工作,但是为了更加有效、灵活的使用MFC编程,了解MFC的体系结构往往可以使编程工作事半功倍。它合理的封装了WIN32 API函数,并设

优快云_LBW的专栏 444

【MFC】MFC消息处理和映射

00. 目录 文章目录00. 目录01. 概述02. 框架中的消息和命令2.1 消息2.2 消息处理程序2.3 消息类别2.4 映射消息2.5 命令ID2.6 标准命令2.7 命令目标03. 框架如何调用处理程序3.1 消息发送和接收3.2 非命令消息如何到达其处理程序3.3 命令路由3.4 命令路由示例3.5 OnCmdMsg 处理程序3.6 重写标准命令传送04. 框架如何搜索消息映射4.1 消息映射的位置4.2 派生消息映射05. 声明消息处理程序函数5.1 标准 Windows 消息的处理程序5.2

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 2062

为控制台窗口建立消息队列(转)

介绍Windows的窗口、消息、子类化和超类化(2011-05-08 15:32:07) 转载▼标签: 杂谈分类: windows程序设计这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词。为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和线程。子类化(Subclassing)和超类化(Superclassing)是伴随Windows窗口机制而产生的两个复用代码...

oushaojun2的专栏 1089

【MFC】学习笔记:常用类——定时器

01、文章目录 文章目录01、文章目录02、定时器介绍03、启动MFC定时器3.1 MFC创建定时器函数3.2 添加消息处理函数或者回调函数04、销毁MFC定时器05、Windows API 定时器5.1 启动定时器5.2 添加消息处理函数或者回调函数5.3 销毁定时器06、MFC定时器实例07、总结 02、定时器介绍 定时器,可以帮助开发者或者用户定时完成某项任务。在使用定时器时,我们可以给系统传入一个时间间隔数据,然后系统就会在每个此时间间隔后触发定时处理程序,实现周期性的自动操作。 例如: 我们

Cain Xcy的博客 3468

【MFC】MFC消息响应机制|消息映射表|MFC程序框架/VC 程序运行框架/VC运行顺序 从哪运行 |VC程序快捷键的添加

MFC消息响应机制分析 ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析,可以帮助程序开发人员对MFC的消息映射机制有一个比较透彻的了解。 1.引言 ---- VC++的MFC类库实际上是Windows下C++编程的一套最为流行的类库。M......

我的笔记本 705

【MFC】MFC消息响应机制|消息映射表|MFC程序框架/VC 程序运行框架/VC运行顺序 从哪运行 |VC程序快捷键的添加...

目录 MFC消息响应机制分析 MFC消息响应机制分析http://www.cnblogs.com/dsky/archive/2012/05/28/2520853.html 【MFC 快捷键】VC程序快捷键的添加 【MFC 程序框架】MFC程序框架/VC 程序运行框架/VC运行顺序 从哪运行 MFC消息响应机制分析 MFC消息响应...

小鱼菜鸟的博客 710
上一篇: No MFC 编程04 - 关于简单的结果输出
下一篇: No MFC 编程06 - 检测来自系统的消息
temp77
博客等级 码龄24年 21粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值