模态窗口原理及注意事项

关于Qt中QDialog对话框调用exec()函数界面退出造成僵尸程序问题 关于Qt中QDialog对话框调用exec()函数的退出问题。 阅读详情

前言

在开发Windows引用程序的时候,在一些需要用户确认,或者提示用户注意的场合,经常使用模态对话框,或者叫模态窗口。在绝大多数情况下,模态窗口给开发人员带来了极大的便利,并且在某些应用上有不可替代的优势。然而凡事有利必有弊,如果不正确地使用模态窗口,却有可能带来某些严重问题,甚至可能引起程序崩溃。要想知道为什么模态窗口可能带来某些严重问题,就必须首先了解模态窗口的实现原理。因此本文将首先介绍模态窗口实现原理,然后分析为什么会带来问题。

原理

知道了原理,一切就可迎刃而解。了解了原理,就可以知道,模态窗口并不是Windows特有的,而是可以在任何一个GUI系统中实现出来,包括手机上。

因为Windows上的模态对话框为众人所知,因此本文的例子都是指Windows上的,并且有时候会特指是MFC的。

众所周知,当模态窗口被打开之后,正常的流程会暂时挂起,或者通俗一点说,程序停住了,直到模态窗口关闭才会继续执行。例如下面这段代码:

CInputDialog dlg;

if(dlg.DoModal() == IDOK)

{

// 执行按了确定按钮退出的流程

}

else

{

// 执行通过别的方式退出的流程,例如按了取消按钮

}

// 继续执行

在这段代码里,在CInputDialog窗口关闭之前,注释部分的代码是不会得到执行的。

接下来请先思考一个问题,为什么调用了dlg.DoModal()之后,程序会停住呢?

首先,不可能是线程被挂起,因为一般情况,只有一个主线程,如果线程挂起,那就什么也做不了了,但显然模态窗口弹出来之后还是可以做很多事情的。

其次,也不可能是用类似于Sleep之类的函数,让程序等待,和线程挂起一样。

如果我们了解Windows应用程序的运行的原理,了解消息分发的机制,就可以知道,UI线程有一个消息循环,通过GetMessage之类的函数获取消息,并且分发。如果没有这个消息循环,整个窗口系统就无法正常工作。很显然,当有模态窗口打开的时候,整个窗口系统还是正常工作的,因此可以确定,此时消息循环一定还在正常运行着。这个消息循环在哪里呢?因为当模态对窗口弹出来之后,程序就暂停了,相当调用模态窗口的函数一直没有返回,那么也就没有机会再进入缺省消息循环了,这到底是怎么回事呢?福尔摩斯经常说:"除去不可能的剩下的即使再不可能,那也是真相。"基于这个道理,真像只有一个,就是模态窗口内部有一个消息循环,负责消息的接收和转发。

为了证明这个说法,可以做个试验,弹出一个模态对话框,并设置合适的断点,查看堆栈。

使用DialogBox(NULL, MAKEINTRESOURCE(IDD_MAINDLG), m_hWnd, DialogProc);语句弹出对话框,并且在DialogProc里设置一个合适的断点,我们可以在堆栈中看到这样的信息:

    ZK.exe!CMainDlg::DialogProc(HWND__ * hwndDlg=0x000411e0, unsigned int uMsg=0x00000201, unsigned int wParam=0x00000001, long lParam=0x003a009c) 行90    C++

    user32.dll!_InternalCallWinProc@20() + 0x23 字节    

    user32.dll!_UserCallDlgProcCheckWow@32() + 0xa9 字节    

    user32.dll!_DefDlgProcWorker@20() + 0x7f 字节    

    user32.dll!_DefDlgProcW@16() + 0x22 字节    

    user32.dll!_InternalCallWinProc@20() + 0x23 字节    

    user32.dll!_UserCallWinProcCheckWow@32() + 0xb3 字节    

    user32.dll!_DispatchMessageWorker@8() + 0xe6 字节    

    user32.dll!_DispatchMessageW@4() + 0xf 字节    

    user32.dll!_IsDialogMessageW@8() - 0xeaa7 字节    

    user32.dll!_DialogBox2@16() + 0xc0 字节    

    user32.dll!_InternalDialogBox@24() + 0xb6 字节    

    user32.dll!_DialogBoxIndirectParamAorW@24() + 0x36 字节    

    user32.dll!_DialogBoxParamW@20() + 0x3f 字节    

    ZK.exe!CMainDlg::OnOK(unsigned short __formal=0x0000, unsigned short wID=0x0001, unsigned short __formal=0x0000, unsigned short __formal=0x0000) 行98 + 0x1d 字节    C++

上面的堆栈信息中,红色加粗的函数是API函数IsDialogMessage,这个函数的第二个参数是LPMSG lpMsg,这个正是从GetMessage返回的当前消息的结构体。可以想象,在DialogBox函数内部的实现里,在调用IsDialogMessage之前,必定先通过GetMessage之类的函数,从消息队里返回了当前的消息了。

到了这里,我们基本可以确定,在模态窗口内部,也实现了一个消息循环,真是这个消息循环接管了线程中缺省的消息循环,使整个窗口系统能继续正常的工作。同时由于消息循环其实也是一个有退出条件的死循环,因此到这个循环结束之前(一般是关闭了模态窗口),模态窗口后面的代码是不会继续执行的。

理解了模态窗口的原理,就可以在任何支持消息队列的GUI系统中,加入模态窗口的机制,这会减少很多开发工作。例如很多手机平台不支持模态窗口,开发一些需要用户确认的功能就比较麻烦,其实完全可以加入模态窗口,简化开发。

注意事项

模态窗口极大地简化了一些需要和用户交互的操作,好处显而易见。但这里还是要指出一些需要注意的地方,否则使用的时候很可能会出问题。

影响PreTranslateMessage机制

在使用MFC,WTL等进行开发的时候,经常用到PreTranslateMessage机制,这个机制可以让我们在消息被派发之前先做一些事情。很多人以为PreTranslateMessage是Windows本身支持的,其实不然。PreTranslateMessage是MFC和WTL自己引入的一个概念,完全是和Windows无关的。在MFC和WTL的消息循环中,这两个库的设计者在消息分发之前,人为的加了一些代码,使得整个架构支持这一套机制。

正是如此,如果在正常的流程中弹出了模态窗口,就会使正常的PreTranslateMessage机制失效。因为模态窗口中已经包含了一个消息循环,接管了线程中缺省的消息循环。而这个消息循环是在DialogBox这个API函数中执行的,显然不可能再有PreTranalateMessage机制了。

为了解决这一问题,只有让模态窗口也使用和UI线程相同的消息循环,MFC正是这么做的。在MFC中,对话框类的DoModal函数,并不是调用DialogBox函数,而是直接使用CreateWindows创建一个非模态窗口,在窗口创建成功之后再调用MFC自己的消息循环,这样就可以让PreTranslateMessage继续生效。同时在窗口创建出来之后,必须再做一些别的操作,使这个模态窗口的父窗口失效(一般直接把窗口Disable掉)。同时消息循环里有合适的退出条件,并有恢复现场的一些操作,具体可以查看MFC的DoModal函数。

WTL到目前为止,貌似暂时还没有一个合适的方案来解决这个问题。事实上WTL的PreTranslateMessage机制实现的其实是有点问题的,或许以后会在这方面做一定的增强。

可能导致崩溃

这是一个严重问题,在条件合适的情况下,这个崩溃是必然的。

因为模态窗口弹出来之后,模态窗口后面的代码在窗口关闭之前将不会得到执行。然而此时整个窗口是在正常运行的,对于一些极端的情况,是极有可能造成崩溃的。下面看一个例子:

void CTestDlg::OnOK()

{

    CInputDialog dlg;

    If(dlg.DoModal() == IDOK)

    {

        m_nValue = dlg.GetValue();

        UpdateData(FALSE);

    }

}

这是一段典型的MFC代码,在绝大多数情况下,不会有任何问题。但是由于模态窗口弹出的时候,只是父窗口不能操作,但别的窗口完全还能正常运行,这时候就非常有可能由于某种原因,CTestDlg类已经销毁了,而CInputDialog却不知道,还在继续执行,结果到了IDOK之后,对CTestDialog类的成员变量m_nValue赋值,就会出现崩溃了。

这个问题,如果在多线程的情况下,将会更加严重。因为在多线程的情况下,将会有更加多的不可预料的因素,所以使用的时候要更加小心。

 

模态窗口详解及各浏览器适配经验分享 阅读详情

相关推荐

Tkinter多窗口编程实战:从Tk/Toplevel到数据通信与模态窗口

在桌面应用开发中,多窗口编程是构建复杂、专业级应用的核心技能。其基础原理在于理解窗口层级与生命周期管理,例如在Tkinter中,通过区分主窗口(Tk)与子窗口(Toplevel)来构建应用骨架。这项技术的核心价值在于实现清晰的界面分离与功能模块化,从而提升代码可维护性与用户体验。典型的应用场景包括设置对话框、工具面板、数据编辑表单等需要并行或独立交互的界面。本文以Python Tkinter为例,深入探讨了多窗口架构设计,并重点解析了**数据传递**与**模态窗口**的实现机制,通过一个通讯录管理应用的完整

weixin_33970449的博客 375

关于mfc中的timer中使用messagebox和锁导致程序异常崩溃问题

今天一同事发现在timer函数中使用了锁,结果跑着跑着就崩溃了,不知道其中的原因。 我拿过代码来一看,一看也没看到原因。后来通过调试发现了问题,就是mfc中timer有点坑。 过程大概如此: 定义timer函数 onTimer() { std::lock_guard<std::mutex> guard(mutexA); ... messagebox()...

sidemap的博客 911

优化CAN总线EMI性能:60R+60R+电容终端电阻设计解析

本文深入解析了CAN总线中采用“60R+60R+电容”终端电阻设计以优化EMI性能的原理与实战方法。该设计通过在差分信号中点接入电容,为高频共模噪声提供低阻抗泄放路径,从而在不影响正常通信的前提下,显著提升总线在复杂电磁环境下的抗干扰能力与可靠性。文章详细阐述了元件选型、PCB布局要点及典型应用场景。

devops8pract的博客 364

模态窗口原理及注意事项--http://www.alisdn.com/wordpress/?p=53

前言 在开发Windows引用程序的时候,在一些需要用户确认,或者提示用户注意的场合,经常使用模态对话框,或者叫模态窗口。在绝大多数情况下,模态窗口给开发人员带来了极大的便利,并且在某些应用上有不可替代的优势。然而凡事有利必有弊,如果不正确地使用模态窗口,却有可能带来某些严重问题,甚至可能引起程序崩溃。要想知道为什么模态窗口可能带来某些严重问题,就必须首先了解模态窗口的实现原理。因此本文将...

weixin_30840253的博客 113

解决Bootstrap中模态框的常见问题

其中,模态框(Modal)是一个常用的组件,用于展示弹出窗口,包括提示信息、表单输入等。然而,在使用Bootstrap的模态框时,可能会遇到一些常见的问题。在使用Bootstrap中的模态框时,可能会遇到一些常见问题,如模态框无法显示、背景问题、关闭问题以及表单提交问题。通过正确设置触发方式、目标元素、引入Bootstrap的CSS文件、关闭按钮和事件绑定,以及处理表单提交事件,可以解决这些问题。同时,检查是否有其他CSS文件或样式与Bootstrap的样式冲突,可以通过在模态框的外层包裹一个自定义的。

CflfEditor的博客 1624

R | 提取文件夹内栅格数据的最小值、最大值、标准差和平均值

各位同学好,我们长需要用长时间序列栅格数据的平均值做变量的时间变化分析,用代码能够帮助我们省下很多时间。

qq_48539301的博客 449

模态窗口其实就是在当前窗口调用系统的消息循环,响应用户的操作,将相关的消息发送到对应的窗口

模态窗口其实就是在当前窗口调用系统的消息循环,响应用户的操作,将相关的消息发送到对应的窗口(转) 上周准备在公司内部转岗,面了3个部门windows客户端相关的工作,最终拿到3个Offer,主要涉及C++和Windows两大块内容,C++的题目基本都答上了,Windows一直都是我的弱项,在这里记录一下Windows相关的题目。有些答不上的问题就没列出来,还有些问题忘了,下面的答案有些大部...

qq_34653062的博客 283

使用Matlab进行IEEE 33节点潮流计算的NR法实现详解及应用实例

IEEE 33节点系统是一个标准的配电系统模型,广泛用于学术研究和工程应用。该系统由33个节点和37条线路组成,结构复杂,具有代表性。其潮流计算结果可用于验证各种潮流计算方法的准确性和效率。NR法是一种基于迭代求解的潮流计算方法,通过不断迭代求解非线性方程组,直到达到预定的收敛条件。NR法具有收敛速度快、计算精度高的优点,适用于大规模复杂电力系统的潮流计算。

m0_57781768的博客 2070

VB6,VBA弹窗都是模态窗口,VBA 窗体实现不卡住的弹窗

在 VBA 中,标准的MsgBox或通过API 调用的弹窗都是(Modal Window),会阻塞当前进程直到用户关闭弹窗,这是由 Windows 窗口机制和 VBA 单线程执行模型决定的。如果需要(弹窗显示时不阻塞代码继续运行,即使不关闭弹窗也不影响进程),可以通过模拟实现,因为 UserForm 支持非模态显示。

910

虚拟机Ubuntu连接USRP

笔记本通过网线连接USRP。

xiaozir的博客 2306

WPT无线电能传输公式推导、编程计算、仿真验证全过程

主要分为5大模块,分别为无补偿,SS,SP,PP,PS,每个模块对应有公式推导,matlab编程计算相关参数以及将计算参数和仿真验证观察是否对应。采用matlab编程计算参数以及simulink仿真验证

zzhao2580的博客 7755

iOS开发系列--视图切换

2014-08-28 08:27 by KenshinCui, 80493 阅读, 61 评论, 收藏,  编辑 概述 在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单。在iOS开发中常用的视图切换有三种,今天我们将一一介绍: UITabBarControllerUINavigationController模态窗口 UITa

yuleidnf的博客 1971

矩阵理论与应用:数理经济学中的投入产出模型分析

1. 背景介绍 矩阵理论是现代数学中的一个重要分支,它在各个领域都有广泛的应用。其中,投入-产出模型是矩阵理论在经济学中的一种应用,它可以用来分析一个国家或地区的经济结构和发展趋势。本文将介绍投入-产出模型的基本概念和原理,并通过实例来说明其应用。 2. 核心概念与联系 投入-产出模型是一

AI天才研究院 1487

MFC编程

1.CString 转换 char * CString str = "123"; // 转换为char指针 char *p = str.GetBuffer(str.GetLength()); // 转换为int变量 int i = atoi(p); cout SetWindowText(temp);)必须在OnInitDialog()函数中完成 3. 正好这里有些现成的 位图按钮的实现方法: 位图必须用.bmp 格式的 首先,我们创建一个基于对话框的应用程序CmyDialog ; Ι.M

seven407的专栏 1767

2025.06.06【Ribo-seq】|RiboCode:基于Ribo-seq数据的全基因组翻译ORF检测工具详解与实战流程

大家好!今天我们要学习的是RiboCode——一个专为Ribo-seq(核糖体足迹测序)数据设计的高质量翻译ORF(开放阅读框)检测工具。RiboCode能够帮助我们在全基因组范围内精准识别翻译事件,发掘经典CDS之外的uORF、dORF、重叠ORF等新型翻译本,极大拓展了我们对转录本翻译潜能的认知。RiboCode 是由清华大学杨学睿课题组开发的开源软件,支持Linux/Mac平台,采用Python实现。自动化流程:一条命令即可完成注释准备、P-site定位、ORF预测。高灵敏度与特异性。

1858

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

最近面试遇到的Windows相关的题目

原文地址:http://www.cnblogs.com/hlxs/p/4091623.html 1:GetMessage和PeekMessage的区别? GetMessage:获取消息队列中的一个消息,存入MSG中,并从消息队列中移除,如果消息队列中没有消息就会阻塞; PeekMessage:查看消息,有消息,就将数据存入MSG结构中,没有消息就返回FALSE,不会阻塞,但如果没

qq799238350的博客 360

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

46. HarmonyOS NEXT 登录模块开发教程(一):模态窗口登录概述

HarmonyOS NEXT 登录模块开发教程(一):模态窗口登录概述效果预览1. 引言2. 登录模块整体架构3. 模态窗口组件详解3.1 什么是模态窗口?3.2 ModalWindow组件实现3.3 核心知识点解析3.3.1 @Component装饰器3.3.2 @State装饰器3.3.3 @Builder装饰器3.3.4 bindContentCover属性3.3.5 资源引用4. 模态窗口的交互流程5. 最佳实践与注意事项6. 小结7. 参考资源。

全栈若城,专注知识分享 5015

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

ng-zorro-antd 实战:在 Modal 模态窗口内嵌入 Cascader 级联选择控件

本文讲解如何在 ng-zorro-antd 的 `nz-modal` 模态窗口中嵌入 `nz-cascader` 级联选择控件,实现"弹窗内完成省市区 / 分类层级选择"的常见交互场景。你将掌握基于信号(signal)管理弹窗显隐与选中值的完整写法、`*nzModalContent` 内容指令的使用方式,以及级联控件在浮层嵌套场景下的注意事项,并附上 Cascader 核心 API 速查与源码级原

gitblog_09773的博客 997

控制器跳转和视图切换之NavigationController,UITabBarController,模态

控制器跳转和视图切换之NavigationController,UITabBarController,模态  2016-04-26 12:20 941人阅读 评论(0) 收藏 举报  分类: iOS/oc(228)  在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单。在iOS开发中常

wakice的博客 2001

避坑指南:DTMultiWindow插件在UE项目中的常见问题与解决方案

本文深入解析DTMultiWindow插件在UE项目中的常见问题,包括窗口大小异常、模态窗口失效和位置偏移等,提供从基础配置到高级技巧的完整解决方案。通过详细的参数说明和实战案例,帮助开发者高效使用这款UMG多窗口插件,优化UI系统设计。

weixin_33704234的博客 177

50.HarmonyOS NEXT 登录模块开发教程(四):状态管理与数据绑定

HarmonyOS NEXT提供了多种状态管理装饰器,每种装饰器都有其特定的使用场景和功能特点。装饰器功能描述使用场景@State组件内部状态,变化会触发UI刷新管理组件内部状态@Link与父组件状态建立双向数据绑定子组件需要修改父组件状态@Prop从父组件接收只读属性父组件向子组件传递只读数据跨组件层级共享数据祖先组件向后代组件提供数据与对象类型的状态建立双向绑定绑定对象类型的状态变量与应用全局状态建立双向绑定管理应用级别的持久化状态从应用全局状态获取只读数据。

全栈若城,专注知识分享 4868

iOS微信红包助手终极指南:从原理到实战的完整教程

💫 还在为错过微信群里的红包而烦恼吗?iOS微信红包助手正是你需要的解决方案!这款强大的微信抢红包插件能够让你在后台和锁屏状态下自动抢红包,再也不用担心错过任何红包机会。 ## 🔍 微信红包助手是什么? **iOS微信红包助手**是一款专门为微信设计的自动化工具,通过技术手段实现红包的自动识别和领取。它完全模拟用户的点击操作,有效防止微信检测到作弊行为,让你的抢红包体验更加智能高效。 [

gitblog_00161的博客 1053

微信小程序的弹窗如何实现?使用场景是什么?底层原理是什么?

组件化开发:通过将弹窗封装成独立的组件,可以在多个页面中复用相同的弹窗逻辑和外观设计。状态管理:通常会结合方法来控制弹窗的显示隐藏状态,确保弹窗的状态能够在不同组件之间同步更新。动画效果:可以使用 CSS 动画或者微信小程序提供的animationAPI 来添加弹窗出现消失时的过渡效果,提升用户体验。

长风破浪会有时的博客 2299
上一篇: 软件测试方法论----黑盒测试篇(开发观点看测试)
下一篇: 编码原则十日谈
cplusplus_zk
博客等级 码龄18年 84粉丝 10原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值