剖析WINX的Hello程序

深入剖析WTL——如何封装Windows界面程序 首先还是让我们来看看WTL是怎样封装应用程序线程的。 和ATL类似,WTL使用一个_Module全局变量来保存全局数据,并通过它来引用应用程序级的代码。在WTL中,该变量是CAppModule或CServerAppModule的实例。后者通常作为COM服务器的应用程序。 每个应用程序都有一个或多个界面线程组成。首先剖析一下WTL是怎样管理只有一个界面线程的(除了Mutli-SDI应用程序)。 阅读详情

概述

我们已经介绍了Windows SDK的Hello程序,它的流程主要分为三个步骤:

  1. 注册窗口类(RegisterClass)。并且我们详细解释了为何要有窗口类,为何要RegisterClass。
  2. 创建并显示窗口(CreateWindow and ShowWindow)。
  3. 消息循环(MessageLoop)。即:取得消息 -> 分派消息 -> 处理消息。

这里,我们就要结合WINX的Hello程序,把整个流程串一遍。

作为比较,我想温习一下ATL/WTL的Hello程序。我们在此提供了几篇剖析ATL/WTL的Hello程序的好文章:

WINX的Hello程序

 

#define  WINX_USE_APPMODULE
#include 
< winx.h >

class  CHelloMainFrame :  public  winx::MainFrame < CHelloMainFrame >
{
    WINX_CLASS(
" CHelloMainFrame " );
public :
    
void  OnPaint(HWND hWnd)
    {
        winx::PaintDC dc(hWnd);
        dc.TextOut(
1 ,  1 , _T( " Hello, WINX! " ));
    }
};

winx::CAppModule _Module;

int  APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     
int        nCmdShow)
{
    CAppModuleInit module;

    CHelloMainFrame::RegisterClass();
    CHelloMainFrame wndMain;
    wndMain.Create(NULL, _T(
" Hello " ));
    
    
return  module.Run();
}

 

WINX的编程模型

1. 注册窗口类(RegisterClass)

WINX中RegisterClass是需要主动调用的,这倒省了象ATL/WTL那样解释半天:-)

区别于已知的所有C++界面库(MFC、ATL/WTL、SmartWin、wxWidgets等等,甚至包括我早期写的SW系统),WINX倾向于把RegisterClass概念告诉用户。并且,为此我专门写了一篇“Windows精解:窗口类释疑”来解释相关概念的重要性。这一切与WINX的可视化策略有关,我们在“WINX如何做到可视化界面开发”中详述这一点。

以下这些宏与WINX的RegisterClass有关:

  • WINX_CLASS / WINX_CLASS_EX
  • WINX_CLASS_STYLE
  • WINX_DEFAULT_BKGND / WINX_DEFAULT_COLOR / WINX_DEFAULT_BRUSH
  • WINX_DEFAULT_CURSOR / WINX_DEFAULT_SYSCURSOR

它们分别对应Windows窗口类(WNDCLASSEX)中的成员:

  • lpszClassName
  • style
  • hbrBackground
  • hCursor

大家已经熟悉用WINX_CLASS指定窗口类的名称,其他宏的用法完全一致。例如,默认鼠标光标是箭头(IDC_ARROW),要改为象Edit控件一样使用IDC_IBEAM,很容易:

class  CHelloMainFrame :  public  winx::MainFrame < CHelloMainFrame >
{
    WINX_DEFAULT_SYSCURSOR(IDC_IBEAM);
    ...
};

 

2. 初始化类(InitClass)

WINX引入了许多小巧的初始化类。大致有:

  • CComAppInit - COM初始化类,即CoInitialize/CoUninitialize对。 
  • COleAppInit - OLE初始化类,即OleInitialize/OleUninitialize对。
  • CDebugAppInit - 启动内存泄漏调试(仅Debug版本,Release版本为空类)。
  • CComModuleInit - CComModule Init/Term。
  • CAppModuleInit - CAppModule Init/Term。
  • GdiplusAppInit - GdiplusStartup/GdiplusShutdown。

这些初始化类代码简单,但是抽象得恰到好处。在WINX之前,我曾经试图把这些初始化过程包装起来不让用户看到,但是最终不得不放弃。

 

3. 消息循环(MessageLoop)

目前,WINX并未提供自己的消息循环。我们借用WTL的CMessageLoop::Run。你没有在WINX的例子中见到CMessageLoop,是因为它被CAppModuleInit 类隐藏起来了。

class  CAppModuleInit :  public  WTL::CMessageLoop
{
public :
    CAppModuleInit(
        _ATL_OBJMAP_ENTRY
*  p  =  NULL,
        HINSTANCE hInst 
=  GetThisModule(),
        
const  GUID *  plibid  =  NULL)
    {
        _Module.Init(p, hInst, plibid);
        _Module.AddMessageLoop(
this );
    }
    
~ CAppModuleInit()
    {
        _Module.Term();
    }
};

 

4. 窗口过程(WindowProc)

消息循环中,消息最终被Windows发送到窗口过程(WindowProc)中。那么WINX的窗口过程在哪?

template  < class  WindowClass,  class  HandleClass  =  DefaultWindowHandle >
class  Window
{
public :
    
static  LRESULT CALLBACK WindowProc(
        HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        WindowClass
*  pWnd  =  (WindowClass * )WindowMap::GetWindow(hWnd);
        
if  (pWnd  ==  NULL)
        {
            
if  (message  !=  WM_NCCREATE)
                
return  pWnd -> InternalDefault(hWnd, message, wParam, lParam);
            LPCREATESTRUCT lpCS 
=  (LPCREATESTRUCT)lParam;
            
if  (lpCS -> lpCreateParams) {
                pWnd 
=  (WindowClass * )lpCS -> lpCreateParams;
                lpCS
-> lpCreateParams  =  NULL;
            }
            
else  {
                
if  (WindowClass::StackWindowObject) {
                    WINX_ASSERT(
" WindowClass::StackWindowObject - unexpected! " );
                    
return  FALSE;
                }
                
else  {
                    pWnd 
=  WINX_NEW(WindowClass);
                }
            }
            WindowMap::SetWindow(hWnd, pWnd);
        }
        
return  pWnd -> ProcessMessage(hWnd, message, wParam, lParam);
    }
};

这里面有几个细节需要解释:

  • WindowMap::GetWindow/SetWindow是什么?在介绍“SW系统的窗口类”时,我们提到:
       - MFC通过一个全局的HashMap建立窗口句柄(hWnd)到窗口对象(pWnd)的映射。
       - SW系统通过窗口的UserData建立窗口句柄(hWnd)到窗口对象(pWnd)的映射。

    在WINX中,建立两者映射的策略是任选的。除了以上两者中外,还有第三种选择:
      - 使用SetProp/GetProp建立映射。并且这是WINX默认的选择。
      - 你自己实现的其他方式。

    我们简单分析一下,这些方式的利弊。
      - 通过HashMap建立映射,问题在于这个HashMap对象如何在其他的DLL中取到?这导致bug或者强耦合的结构。
      - 通过窗口的UserData建立映射,问题在于如果UserData已经被占用怎么办?这导致机制上不安全的隐患。
      - 使用SetProp/GetProp建立映射,性能比UserData方式慢,但极其安全。
     
  • WindowClass::StackWindowObject是什么?我们知道,对象(当然包括C++窗口对象)有两种创建方式:
      - 创建在栈(Stack)上。即以局部自动变量方式创建。
      - 创建在堆(Heap)上。即通过new/delete创建。
    WINX允许你为窗口类选择其中一种。详细我们在以后由专文叙述。
     
  • 最后,窗口消息被pWnd->ProcessMessage(hWnd, message, wParam, lParam)处理。ProcessMessage进行了最终的消息分派。这一块是WINX消息机制的核心,前面我们我们已经仔仔细细作了讲解:
      - WINX的消息分派机制
      - WINX的消息分派机制(续)
      - WINX的消息分派机制(续2)
      - WINX的消息分派机制(终结篇)
 
zlib、gzip与zip核心原理全解析:从DEFLATE算法到EOCD错误排查 数据压缩是计算机科学中的基础技术,其核心原理在于通过算法消除数据冗余,减少存储空间和网络传输量。DEFLATE算法结合了LZ77字典编码和霍夫曼编码,实现了高效的无损压缩,成为众多压缩格式的基石。在工程实践中,zlib库提供了DEFLATE算法的高效实现,作为底层引擎被广泛集成。基于zlib构建的gzip格式专注于单文件压缩,常用于HTTP传输优化和日志归档;而zip格式则在此基础上增加了多文件归档和中央目录索引功能,支持随机访问和跨平台交换。理解这些核心概念和层级关系,能帮助开发者有效处理日常开发中遇到的 阅读详情

相关推荐

VC++界面编程之--实现工具栏自定义皮肤

工具栏的工作原理就是:首先在父窗口上创建一个子窗口,然后在一个子窗口上创建不同ID的按钮,当用户点击某个按钮时,就会以一个命令的方式通知父窗口:我被点击了。所以我沿着这个思路,制作了一个自定义皮肤的工具栏。 与之配套的博客:http://blog.youkuaiyun.com/rmxming/article/details/20123045

WinAPI WinMain函数

WinMain函数是提供给用户的Windows应用程序入口点,其原型如下: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ipCmdLine, int nCmdShow); 函数有四个参数: hInstancd: 是当前应用长须实例的Handle。 hPrevInstance: 是应...

weixin_30875157的博客 883

智能车八邻域图像算法_二

智能车八邻域图像算法 文章目录智能车八邻域图像算法前言一、一些想法二、生长方向的使用1.点的生长方向的表示2. 用点的生长方向来做初步判断1.引入库2.读入数据总结 前言 上一篇里面讲过用八邻域来获得赛道边界:智能车八邻域图像算法 当已经能稳定获得赛道边界时,就可以进行元素识别,获得偏差了。 这里就介绍一下我的一些思路。 早在前两年,优快云上就有一篇关于八邻域如何处理元素的文章第十五届全国大学生智能汽车竞赛-双车组三轮图像处理总结,写得很好,我当时也参考了这篇文章,但是我觉得不是很详细,所以我这里想写得

技术缝合怪的博客 1万+

Extern 的问题 && error LNK2001: unresolved external symbol "class WTL::CAppModule _Module" (?_Module@@3VCAppModule@WTL@@A)

Re: Mike Dunn's tutorial --- In wtl@yahoogroups.com , luther baker wrote: > > I am walking through this tutorial in visual studio 2008. > > http://www.codeproject.com/KB/wtl/wtl4mfc2.aspx > > I am about half way down and per the tutorial, I have im

henry_sea的专栏 3138

音视频入门:H264、H265概念总结

添加链接描述 什么是H.264与H.265 H.264与H.265都是视频压缩格式,由于视频本身的码流太大,所以需要经过压缩然后再通过网络进行传输。H.264是目前比较主流的压缩算法,像视频会议设备一般都采用这个编码格式。基础的H.264可以支持在1M带宽下传输720P30帧/秒的图像;H.264 HIGH PROFILE支持在512K带宽下传输720P30帧/秒的图像。 H.265是比较新的压缩算法,可以更一步提高压缩比,随着我们现在生活中出现的视频格式越来越大(比如现在基本都是1080P甚至4K的显示器

weixin_40673765的博客 8938

通达信+大智慧数据同步存调DLL

数据同步存调DLL(通达信版+大智慧版)

guleba的博客 2060

如何建立第一个WinX程序

如何快速入门Windows编程 Windows精解:窗口类释疑 Windows精解:超类与子类 剖析WINX的Hello程序  【基础】如何建立第一个winx程序

绅士亦花心 1245

NetSuite软件二次开发:NetSuite二次开发最佳实践与案例分析

SuiteScript是NetSuite提供的一种用于二次开发的脚本语言,它基于JavaScript,但添加了特定的API和框架,以支持NetSuite平台的业务逻辑开发。SuiteScript有两种版本:SuiteScript 1.0和SuiteScript 2.0,后者提供了更现代的面向对象编程模型,增强了代码的可读性和可维护性。NetSuite允许用户自定义字段以满足特定的业务需求。这些字段可以添加到现有的记录类型中,也可以用于自定义记录。自定义字段可以是文本、数字、日期、下拉列表等多种类型。

kkchenjj的博客 1470

WTL体系结构(2)

WTL体系结构程序线程    跟ATL一样,WTL程序也需要一个_Module全局变量来保存全局数据,方便应用级代码访问.在WTL中,这个变量是CAppModule或CServerAppModule的实例,后者在程序同时作为一个COM服务器时用到.每个应用程序具有一个或者多个UI线程.WTL使用两种方式来管理这些线程.    如果应用程序只有一个UI线程(除了多线程SDI以外,其他程序类型

dairyman的专栏 2020

芒果YOLO11改进17:即插即用 | 损失函数Repulsion Loss|Repulsion 解决目标遮挡场景下的目标检测,为解决密集人群检测中遮挡设计的损失函数,打造高效

即插即用 | 损失函数Repulsion Loss|Repulsion 解决目标遮挡场景下的目标检测,为解决密集人群检测中遮挡设计的损失函数,打造高效

包括YOLOv5、YOLOv7、YOLOv8等模型改进 485

基于STM32设计的4G远程视频侦查小车(图传+远程控制+EMQX+MQTT)(204)

当前设计了一款基于STM32F103ZET6主控芯片和废旧Android手机改造的4G侦查小车。该设计充分利用已有的智能手机硬件资源,实现摄像头画面的实时采集与上传,以及远程控制功能。这样的设计不仅降低了成本,而且充分利用了废旧手机中高性能的硬件资源,如摄像头、4G通信模块和电池等,实现了资源的有效循环利用。

2536

专访许式伟:技术狂热分子的蜕变经历

金山软件事业部的技术总监许式伟常常称自己是一个计算机的狂热爱好者。对于他深厚的软件开发经历,他只简单的分成了桌面开发阶段、服务器开发阶段。但我想这每一个阶段中都蕴涵了很多关于他奋斗故事。许式伟将他的2个开发阶段分成了4个时期,第一个时期是WPS Office旧版本的开发,包括WPS Office,WPS Office 2002。第二个时期是WPS Office V6也就是WPS Office 20

TonyWang的专栏 1442

【重温童年】基于tkinter模块设计的Q宠大乐斗武器升星模拟器:重温经典,畅享休闲时光

与传统的Q宠大乐斗不同,这款模拟器还加入了一个创新的功能——自定义升星概率。玩家可以根据自己的喜好和策略,为不同的武器设置不同的成功率和降级率。比如,你可以将“嗜血”这把武器的升星难度设置得极高,以体现其稀有性和强大威力;也可以将“平底锅”这样的普通武器设置得相对容易升星,让玩家在升级过程中感受到更多的成就感。这种自定义的概率设置,不仅增加了游戏的趣味性和挑战性,还让玩家在升级过程中有了更多的策略和选择。你可以根据自己的武器库和卷轴数量,制定出最合适的升级计划,从而在游戏中占据先机。

nmdbbzcl的博客 1238

MFC程序产生、启动全讲解

一、正文 1、Applicate Object产生,内存于是获得配置,初值也设立,也即调用了CWinApp的构造函数 2、CWinApp --> AfxWinMain,它先执行 AfxWinInit --> AfxInitThread 。把消息队列尽量加大到 96 3、AfxWinMain 执行 InitApplication ,这个函数为CWinApp的虚函数,通常不需要改写,主要为MFC内部管理作一些设置 ps.以前的InitApplication是注册窗口类的场所!! 4、AfxWinMai

NightAngle的专栏 815

Linux | Ubuntu18.04安装WIFI6 AX201驱动完整教程

本节介绍了如何在Ubuntu18下安装AX201驱动的教程。

九七的博客 8883

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

使用ATL创建窗口的步骤

1、定义ATL的全局对象CAppModule _module; 2、初始化COM组件:CoInitialize和CoUninitialize; 3、初始化COM模块_module.Init() 代码如下:     HRESULT hRes = ::CoInitialize(NULL);     ATLASSERT(SUCCEEDED(hRes));     hRes =

物知馆 3239

OV9734 DATASHEET,完整规格书

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

MFC应用程序设计(第二版)学习笔记

第一章, Windows应用开发基础 基本概念 windows API函数按功能大体分为以下: 窗口管理函数 WUI 图形设备管理函数 GUI 系统服务函数 SUI   早期开发使用软件开发工具包sdk,softwaredevelopment kit 就是直接使用API函数来开发应用程序 自面向对象发展以来,人们对WindowsAPI进行了封装,从而使Windows应用程序结构和

点滴积累成就技术梦想 6558

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

BCB 与 WTL (二)

话接上回我们的第一个WTL程序, 现在我们一步步的往下看这段代码:#include atlbase.h>#include atlapp.h>CAppModule _Module;#include atlwin.h>#include atlframe.h>#include atlcrack.h>#include atlmisc.h>atlapp.h是WTL的基本头文件,它定义了下面用

C++Builder加油站 4327
上一篇: 应用程序框架设计(2):SW系统的窗口类
下一篇: WINX如何做到可视化界面开发
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值