Windows消息的封装之:this 在哪里(一)

Windows消息投递流程:一般窗口消息投递(WM_LBUTTONCLICK) <br />本例通过在单文档程序的视图中添加WM_LBUTTONCLICK消息处理函数,来解释一般窗口消息的投递流程。 基于VS 2005<br />BEGIN_MESSAGE_MAP(CMyView, CView) ON_WM_LBUTTONDBLCLK() END_MESSAGE_MAP() // ON_WM_LBUTTONDBLCLK宏展开 #define ON_WM_LBUTTONDBLCLK() / { WM_LBUTTONDBLCLK, 0, 0, 0, AfxSig_vwp, / 阅读详情

 

一个类的成员函数跟一般函数是不同的,而类的成员函数隐式的包含了一个this指针。

好家伙,一句废话,这是地球人都知道的东西。可是,Windows API 要求的Callback 函数都不是成员函数,而在面向对象的世界里,没有this,日子会过得很苦闷。那么多的Windows Framwork 们,是如何处理这个问题的呢?最近重新翻了一下代码,顺手做个笔记吧。以下是第一集:MFC的实现。

一、背景知识

Windows Framwork 们要解决的最基本的一个问题,就是窗口消息的封装问题。漂亮的窗体对象与消息映射,一下子就把程序员从令人眼花的switch case 中解放出来,不知道给C++程序员们在面对C程序员时带来了多少优越感。下面且让我们从故事的最开始讲起,说一说最初的故事。

Windows 是怎么找到一个窗体的窗口函数的呢?原来,在每一类窗口在系统中注册的时候,都包含了执行窗口函数的指针。这个注册工作是通过RegisterClass API 完成的。

ATOM RegisterClass(
const WNDCLASS* lpWndClass
);

这里的WNDCLASS 结构中,就包含了这个窗口函数的指针。

typedef struct _WNDCLASS {
UINT style;
WNDPROC lpfnWndProc; // 这个就是窗口函数的指针了
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS;

这个窗口函数的原型如下:

LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);

每当消息发给一个窗体的时候,系统自动调用对应的窗口函数。

二、MFC 中的消息封装

在MFC 中,承担WindowProc 任务的是AfxWndProc。这个函数在wincore.cpp。

LRESULT CALLBACK AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
...

// all other messages route through message map
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);

...

if (pWnd == NULL || pWnd->m_hWnd != hWnd)
    return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
}

这个函数最好玩的是这么一句:CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);

好嘛,就是这个FromHandlePermanent(),一下子把窗口类和窗口句柄关联起来了。下面的不用看了。这个FromHandlePermanent()函数怎么实现的呢?我们继续深入看看。

CWnd* PASCAL CWnd::FromHandlePermanent(HWND hWnd)
{
   CHandleMap* pMap = afxMapHWND();
   CWnd* pWnd = NULL;
if (pMap != NULL)
   {
     // only look in the permanent map - does no allocations
     pWnd = (CWnd*)pMap->LookupPermanent(hWnd);
       ASSERT(pWnd == NULL || pWnd->m_hWnd == hWnd);
   }
   return pWnd;
}

原来是查表,通过CHandleMap 来查找CWnd * 和HWND 的关联。现在我们可以差不多猜到MFC在这个问题上的完整思路了:

1、建立一个窗口句柄与窗口类指针的关联表;
2、在AfxWndProc得到系统的每次回调的时候(得到了一个新消息),在上面的关联表中查询这个得到消息的窗口句柄,到底对应哪一个窗口对象;
3、调用AfxCallWndProc,把消息投递到那个窗口对象的消息处理函数里面,从此以后的调用,this 就有了。

好了,现在剩下最后一个问题:这个表是什么时候填充数据的?这是一个很麻烦的事情,因为我们在CreateWindow API 返回的时候,才能知道一个窗口的句柄,在这之前一直是不知道的。但是,这个时候我们再来填充这个关联表,我们肯定就晚了。为什么呢?因为CreateWindow API 在调用过程中,会给新建的窗口发送WM_NCCREATE、WM_CREATE 等消息,假如等CreateWindow 函数返回,我们的窗口对象就拦截不到这些消息了。

所以,MFC使用了一些比较卑鄙的办法^_^ 它给窗口挂了一个WH_CBT 钩子。这个工作是在AfxHookWindowCreate 函数里面实现的,这个函数也在wincore.cpp里面。

void AFXAPI AfxHookWindowCreate(CWnd* pWnd)
{
   _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
   if (pThreadState->m_pWndInit == pWnd)
      return;

if (pThreadState->m_hHookOldCbtFilter == NULL)
{
          pThreadState->m_hHookOldCbtFilter = ::SetWindowsHookEx(WH_CBT,
         _AfxCbtFilterHook, NULL, ::GetCurrentThreadId());
        if (pThreadState->m_hHookOldCbtFilter == NULL)
          AfxThrowMemoryException();
}

...

   pThreadState->m_pWndInit = pWnd;
}

这个函数中,需要注意的除了挂钩之外,还把当前窗口对象的指针,保存在了pThreadState 里面。这是一个线程局部存储的数据,就是所谓的tls。这个保存起来的指针,就会在AfxCbtFilterHook 函数里面,作为窗口对象的指针用来建立句柄跟对象指针的关联。

为了处理跟输入法的兼容,AfxCbtFilterHook代码又长又臭,我就不全部贴了。贴其中最关键的内容:

    AFX_MANAGE_STATE(pWndInit->m_pModuleState);

    // the window should not be in the permanent map at this time
    ASSERT(CWnd::FromHandlePermanent(hWnd) == NULL);

    // connect the HWND to pWndInit...
    pWndInit->Attach(hWnd);

    ...

    pThreadState->m_pWndInit = NULL;

整个关联工作正是由 pWndInit->Attach(hWnd); 来实现的,关联结束之后,把pThreadState 里面的窗口指针置空,为本线程创建下一个窗口作准备。下面就是Attach 函数的实现了:

BOOL CWnd::Attach(HWND hWndNew)
{
   ASSERT(m_hWnd == NULL);     // only attach once, detach on destroy
ASSERT(FromHandlePermanent(hWndNew) == NULL);
    // must not already be in permanent map

...

   CHandleMap* pMap = afxMapHWND(TRUE); // create map if not exist
   ASSERT(pMap != NULL);

   pMap->SetPermanent(m_hWnd = hWndNew, this);

   ...

   return TRUE;
}

好了,整个流程走到这里就差不多说明白了。这些部分《深入浅出MFC》也有些语焉不详,算一个补充吧。

三、结论

MFC 基本上是通过查表来实现对象指针和窗口句柄的关联的。实话实说,这个映射兼容性很好,但是效率实在不敢恭维,每个消息都要查表,这使得整个框架的效率大受影响。正是由于这个原因,新一代的Windows Frameworks 都采用了更新的(也更猥琐)的关联方法。到底是什么方法呢?且听下回分解。

 

我的百度博客:

http://hi.baidu.com/spaceblog/blog

MFC消息封装分析---Windows系列1 MFC 消息流程分析 阅读详情

相关推荐

全面掌握Windows消息机制:消息大全与编程实践

本文还有配套的精品资源,点击获取 简介:Windows消息机制是应用程序与操作系统间通信的基础,涉及各种消息类型,包括系统消息、输入消息、通知消息、绘图消息、定时器消息等。开发者需掌握消息处理技术,以实现高效的应用程序响应。"Windows消息大全及消息列表"资源详细列出所有消息及其在编程中的应用,有助于理解和应用消息机制,解决程序中的问题。学习步骤包括理解消息含义、查看处...

weixin_42590539的博客 2029

LRESULT CALLBACK

LRESULT CALLBACK 它们其实是宏,表示函数的返回类型,你可以在VC里面对它们点右键然后Go To Definition看到它的宏定义。 其实,这就表示了WinProg函数是一个回调函数。在MFC中,得到Message消息以后系统会进行回调,当然,我们需要编写一个回调函数来响应。为了区别于其它函数,在回调函数前加上LRESULT CALLBACK 在微软vc提供的头

小龙王2010 2672

C++封装Windows窗口实战教程

C++作为一种高性能的编程语言,在Windows操作系统中具有广泛的应用。它不仅能够创建复杂的系统级应用程序,还可以用来开发图形用户界面(GUI)应用程序,这得益于其对Windows API(WinAPI)以及Microsoft Foundation Classes(MFC)的原生支持。在C++中,封装是指将数据(或称为属性)和代码(或称为方法)绑定在一起,形成一个类。类是C++面向对象编程的基础,一个类可以定义为一个具有属性和方法的模板,这些属性和方法共同描述了一个对象的特征和行为。

weixin_29097457的博客 1023

总结《二》MFC中WinMain和CALLBACK

MFC中一般消息传递过程 一、路线        1.一般普通窗口或控件建立调用CWnd::CreateEx函数        2.经过资源对话框创建的即不调用CWnd::CreateEx函数 二、分析上述1,先看源码,一切源码说话 BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindo

jadeshu的博客 1245

参考MFC做的WINDOWS消息封装

参考MFC做的windows消息封装 使用方法: 1 需要处理消息的类需要继承Communication_Unit_Abstract 2 类的声明中最后带MESSAGE_MAP_DECLARE() 3 类的实现文件中带有 MESSAGE_MAP_BEGIN(**类名**) ON_WM_MESSAGE(**消息值**, **成员函数指针**) MESSAGE_MAP_END() 4 类的初始化函数(不是构造函数)中需要调用宏MESSAGE_MAP_INIT() 5 处理消息的部分调用on_message函数即可 欢迎大家批评指正

【STM32学习】(29)STM32实现595驱动三个数码管(标准库和HAL库实现)

我选用的单片机型号为:STM32F103系列 74LS595是一个串转并行输出的芯片,它能为单片机节省很多的IO口,应用场景广泛。 现要求三个数码管动态显示,常规设计都是并行实现,需要8个IO数据口,然后还需要3个IO片选数码管接口,这样大大占用了IO口,导致连接的外设变少。因此我们引入74LS595芯片。电路设计如下: 只需要三个共阴极数码管与三个595芯片级联即可完成,通过RCLK,SCK,SER三个IO即可完成对数码管的动态控制并显示。电路焊接的实物图如下: 要求完成功能:实现数.

XiaoCaiDaYong的博客 8263

消息处理函数LRESULT CALLBACK WndProc()、应用程序主函数int WINAPI WinMain ()

一、消息处理函数 LRESULT CALLBACK WndProc();//二、应用程序主函数int WINAPI WinMain ()Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。每个窗口都有一个消息处理函数。在消息处理函数中,对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。     客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。这样,每当有消息产生时,就会去调用这个消息处理函数。通常情况下,客户都不会处理全部的消息,而是只处理自己感兴趣的消息

狼心狗肺猪肾的专栏 2万+

python docx设置标题中文字体rPr.rFonts.set(qn(‘w:eastAsia‘),u‘黑体‘),报错‘NoneType‘ object has no attribute ‘set‘

一、我的代码: 因为要编一个报告自动化生成的代码,所以用了python docx,在设置标题自己写了一段代码,要求将标题设置成:一级标题 黑体 小四 from docx import Document from docx.oxml.ns import qn from docx.shared import Pt def add_Head(document, level, text, font, size): # document word对象 # level 几级标题 # text 标题内容 # f

qq_40272386的博客 8851

windows的消息机制总结

DOS靠过程来驱动,而windows靠消息驱动。 MFC/QT是一个广泛使用的变成类库,对windows的消息机制进行了很好的封装。 1、消息的概念: 消息是指windows操作系统发给应用程序的一个通告,告诉程序某个特定的事件发生了。比如用户点击鼠标,会引发相关的消息,并交给相应的程序去处理。最终处理消息的是应用程序的窗口函数,如果程序不负责处理的话,系统会作出默认的处理。 从数据结构的...

Jacoob1024的博客 7848

别再凭感觉了!手把手教你用Excel搞定激光器MPE与NOHD安全计算(附模板下载)

本文详细介绍了如何利用Excel自动化计算激光器的MPE(最大允许照射量)和NOHD(标称眼危害距离),提升激光安全评估的效率和准确性。通过实战案例和模板下载,帮助工程师快速掌握GB/T 7247标准中的关键计算,避免常见错误,适用于激光测距仪等设备的安评工作。

weixin_30954265的博客 466

【点云可视化】自制ply文件并使用open3d可视化点云

使用open3d可视化点云,需要将点云制作为ply文件传入函数中。 安装open3d 直接使用pip安装 pip install open3d ply文件 ply文件的结构为:文件头+数据内容,文件头从 ply 一行开始,到 end_header 为止,里面定义了此 ply文件中数据的组织形式,包括数据类型和个数。后面是点云的坐标信息及每个点的颜色属性的,参考自 如下为具有5个点的点云,end_header后每一行表示一个点的x,y,z,R,G,B信息 ply format ascii 1.0 comme

这个人很蓝 1万+

windows消息机制

Windows消息机制是Windows操作系统下应用程序与操作系统之间的一种重要通信方式。通过这一机制,应用程序能够接收来自操作系统的各种事件和请求,并作出相应的响应和处理。

逆风飞翔的博客 1564

YOLO26创新改进 | 全网独家创新篇、小目标检测专属 | AAAI 2025 | 引入HS-FPN中的HFP和SDP创新点,从频域增强小目标特征,淘汰FPN进行升级,助力YOLO26有效涨点

本文提出HS-FPN特征金字塔网络,通过高频感知模块(HFP)和空间依赖感知模块(SDP)优化YOLO26模型。HFP利用高通滤波器增强小目标的高频特征,SDP捕获相邻像素的空间依赖关系。在AI-TOD等小目标检测数据集上,HS-FPN相比传统FPN显著提升性能。文章详细介绍了HFP和SDP的模块结构、核心代码实现,以及如何在YOLO26中集成这两个模块的配置方法,提供了多个版本的yaml文件配置方案。实验结果表明该方法能有效改善微小目标检测效果。

Ai缝合怪、助力小伙伴高效发论文 206

windows窗口类的封装——内联汇编传this

先贴一段简单的用 Windows Api创建窗口的代码:  #include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { stat

From zero 679

【Codecs系列】x265编码器(十二):子像素运动搜索

在基于块运动补偿的视频编码框架中,运动搜索是最为重要的环节之一,同时也是编码端最为耗时的模块。运动搜索包括整像素运动搜索和子像素运动搜索,其中整像素运动搜索已经有很多快速算法,比如经典的三步搜索法、菱形搜索、六边形搜索以及TZSearch等等;但子像素搜索的快速算法却比较少,本文主要讲解x265编码器中的子像素搜索方法以及相关的快速搜索方法。

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 748

工业质检升级!C#上位机集成YOLOv8.3.138+Blob分析:尺寸测量+缺陷检测一步到位

工业场景的技术选型,从来不是“选最先进的”,而是“选最适配的”。这个项目的成功,不在于采用了多前沿的技术,而在于找对了“贴合场景的技术组合”和“落地导向的实施思路”。C#上位机的稳定性保障了系统长期运行,YOLOv8.3.138的精度解决了缺陷检测痛点,Blob分析的抗干扰能力确保了尺寸测量准确,三者结合实现了“1+1+1>3”的效果。先摸透场景,再选技术:不要盲目追求最新模型,先深入了解车间环境、生产节奏、精度要求,选择兼容性强、稳定性高的技术方案;数据质量决定模型性能。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 608

拦截Windows消息

                          拦截Windows消息  C++ Builder不愧为Borland公司的优秀产品,用它来开发Windows程序非常快捷高效,但在编程过程中你也会发现它的一些限制性,让你无法实现自己的想法。比如你无法在修改表单的系统菜单;比如使用跟踪栏时,你找不到StartTrack和EndTrack事件,而偏偏你的程序需要这两个事件。Windows API

Woodman007的专栏 1602

【即插即用模块】注意力篇 | TGRS 2025 | MFA聚特征+HPDown保细节+HFF融层级,三大模块各司其职,性能翻倍!

本文介绍了MTMLNet网络中的三大核心模块:MFA(多阶段特征聚合)、HPDown(混合池化下采样)和HFF(分层特征融合)。MFA通过双尺度深度卷积和注意力机制增强特征提取能力;HPDown结合平均池化和最大池化,有效保留下采样过程中的特征信息;HFF采用三注意力机制实现自适应特征融合。这三个模块协同工作,在红外小目标检测与分割任务中取得了SOTA效果。实验表明,各模块在特征提取、信息保留和融合方面均优于传统方法,可灵活应用于各类视觉任务中。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 285

Windows消息列表

353. WM_DDE_ACK=WM_DDE_FIRST+4: 此消息通知一个DDE(动态数据交换)程序已收到并正在处理WM_DDE_POKE,WM_DDE_EXECUTE,WM_DDE_DATA,WM_DDE_ADVISE,WM_DDE_UNADVISE,orWM_DDE_INITIAT消息WM_DDE_DATA=WM_DDE_FIRST+5:一个DDE服354. 务程序提交此消息给DDE客户程序来传递个一数据项给客户或通知客户的一条可用数据项。所有 者应滚动剪贴板图象并更新滚动条的值;

smartDMer的专栏 1183

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

.Net中封装Windows 消息实现进程间通讯

      .NET Framework 中对进程间的通讯支持不多,不过Windows API 已经为我们提供了丰富的进程间通讯的特性。我们可以使用Windows API SendMessage、PostMessage来实现windows 窗体之间的通讯。本文就是将SendMessage封装在一个窗体基类WinMsgData中,把它变成类中的一个方法以方便调用,而接收其他窗体的消息则封装成事件通知

iLinux 2090

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

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

Windows消息Hook简介

众所周知,Windows应用程序都是消息(事件)驱动的,任何一个窗口都能够接收消息,并对消息进行处理,处理完成后进入下一轮循环。通常情况下,程序员可以在窗口过程中处理接收到的消息,但是在一些应用中常常需要获取和处理另外应用程序的消息,而实现此类功能的技术也就本文要讨论的主题――消息拦截技术。

qq_38933606的博客 1553

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Windows 消息循环(一)

Code之余,决定使用gtest来对code做一些测试;

byte4096的专栏 644

Windows界面封装

Win32应用程序可以分成两大类:控制台程序和Windows窗口界面程序。其中控制台程序的入口是main(或_tmain),而窗口界面程序的入口函数是WinMain(或_tWinMain)函数。 首先,我们要明白什么是消息以及消息队列。消息就是Windows系统检测到用户的一些操作(比如鼠标、键盘)并将这些操作的信息进行包装成一个结构体对象传递给应用程序。而消息队列就是Windows保存消息的一

zdrl的专栏 903

WINDOWS消息

产生时间:在程序中创建定时器,当达到时间间隔时,定时器会向程序发送一个WM_TIMER消息(实际上是GetMessage发送的消息)。定时器的精度是毫秒,但是准确度很低。例如设置时间间隔为1000ms,但是会在非1000毫秒到达消息。附带信息:wParam:定时器IDlParam:定时器处理函数指针。

weixin_42284219的博客 1885

Windows消息机制

Windows操作统与众多的应用程序窗口的交互通常是通过消息来驱动的,当某个事件触发后,系统将这些事件封装成消息,放在系统队列当中,然后再将系统队列中属于各个应用程序的消息依次下发给应用程序的线程队列。应用程序通过一个循环来取这些消息,将这些消息进一步下发到程序的各个窗口来进行处理。 1.消息 消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。这个消息在Win...

qq_40134661的博客 790
上一篇: 【读书笔记】如何撰写用例集的一些原则
下一篇: 我的百度博客
Spacesoft
博客等级 码龄23年 0粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值