函数调用

MFC消息机制

断了今生、忘了曾经 提交于 2020-02-05 14:17:00
何谓消息、消息处理函数、消息映射? 消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。具体的某个操作是你的一系列代码。称为消息处理函数。 在SDK中消息其实非常容易理解,当窗口建立后便会有一个函数(窗口处理函数)开始执行一个消息循环,我们还可以清楚的看到消息处理的脉络。一个switch case语句就可以搞定,消息循环直到遇到WM_QUIT消息才会结束,其余的消息均被拦截后调用相应的处理函数。 但在封装了API的MFC中,消息似乎变的有些复杂了,我们看不到熟悉的switch case语句了,取而代之的是一个叫消息映射的东西。为什么MFC要引入消息映射机制,你可以想象一下,在现在的程序开发活动中,你的一个程序是否拥有多个窗体,主窗口就算只有一个,那菜单、工具条、控件这些都是子窗口,那我们需要写多少个switch case,并且还要为每个消息分配一个消息处理函数,这样做是多么的复杂呀。因此MFC采用了一种新的机制。利用一个数组,将窗口消息和相对应的消息处理函数进行映射,你可以理解成这是一个表。这种机制就是消息映射。这张表在窗口基类CWnd定义,派生类的消息映射表如果你没有动作它是空的,也就是说如果你不手工的增加消息处理函数,则当派生窗口接受一个消息时会执行父类的消息处理函数。这样做显然是高效的。 MFC提供的消息结构 同时MFC定义了下面的两个主要结构: AFX_MSGMAP

阻塞I/O、非阻塞I/O和I/O多路复用

£可爱£侵袭症+ 提交于 2020-02-05 13:23:00
一、阻塞I/O 首先,要从你常用的IO操作谈起,比如read和write,通常IO操作都是阻塞I/O的,也就是说当你调用read时,如果没有数据收到,那么线程或者进程就会被挂起,直到收到数据。阻塞的意思,就是一直等着。阻塞I/O就是等着数据过来,进行读写操作。应用的函数进行调用,但是内核一直没有返回,就一直等着。应用的函数长时间处于等待结果的状态,我们就称为阻塞I/O。每个应用都得等着,每个应用都在等着,浪费啊!很像现实中的情况。大家都不干活,等着数据过来,过来工作一下,没有的话继续等着。 二、非阻塞I/O 非阻塞IO很简单,通过fcntl(POSIX)或ioctl(Unix)设为非阻塞模式,这时,当你调用read时,如果有数据收到,就返回数据,如果没有数据收到,就立刻返回一个错误,如EWOULDBLOCK。这样是不会阻塞线程了,但是你还是要不断的轮询来读取或写入。相当于你去查看有没有数据,告诉你没有,过一会再来吧!应用过一会再来问,有没有数据?没有数据,会有一个返回。但是依旧很不好。应用必须得过一会来一下,问问内核有木有数据啊。这和现实很像啊!好多情况都得去某些地方问问好了没有?木有,明天再过来。明天,好了木有?木有,后天再过来。。。。。忙碌的应用。。。。 三、I/O多路复用 多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态

shell编程(五)之函数

。_饼干妹妹 提交于 2020-02-05 12:09:53
function:函数 函数只有被调用才会执行 如何调用:给定函数名   函数名出现的地方,会被自动替换为函数代码 函数的生命周期:被调用时创建,返回时终止 return命令返回自定义状态结果   0:成功   1-255:失败 语法一:   function f_name {   ...函数体... } 语法二: f_name(){   ...函数体... } 练习: 写一个脚本,完成如下要求 1.脚本可接受参数:start,stop,restart,status 2.如果参数非此四者之一,提示使用格式后报错退出 3.如果是start,则创建/var/lock/subsys/SCRIPT_NAME,并显示启动成功 考虑: 如果事先已经启动过一次,该如何处理 4.如果是stop,则删除/var/lock/subsys/SCRIPT_NAME,并显示停止完成 考虑: 如果事先已然停止过了,该如何处理 5 如果是restart,则先stop,在start 考虑:如果本来没有start,如何处理 6.如果是status,则: 如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示”SCRIPT_NAME is running“ 如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示”SCRIPT_NAME is stopped“ #!/bin

Observable详解

╄→尐↘猪︶ㄣ 提交于 2020-02-05 09:09:03
Observable详解 rxjs angular2 在介绍 Observable 之前,我们要先了解两个设计模式: Observer Pattern - (观察者模式) Iterator Pattern - (迭代器模式) 这两个模式是 Observable 的基础,下面我们先来介绍一下 Observer Pattern。 Observer Pattern 观察者模式定义 观察者模式 是 软件设计模式 的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 — 维基百科 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。 我们可以使用日常生活中,期刊订阅的例子来形象地解释一下上面的概念。期刊订阅包含两个主要的角色:期刊出版方和订阅者,他们之间的关系如下: 期刊出版方 - 负责期刊的出版和发行工作 订阅者 - 只需执行订阅操作,新版的期刊发布后,就会主动收到通知,如果取消订阅,以后就不会再收到通知 在观察者模式中也有两个主要角色:Subject (主题) 和 Observer (观察者)

golang beego框架对运行异常的处理

六眼飞鱼酱① 提交于 2020-02-05 07:53:36
运行时异常 panic 在通常情况下,函数向其调用方报告错误的方式都是返回一个 error 类型的值。但是当遇到致命错误的时候,很可能会使程序无法继续运行。Go推荐通过调用 panic 函数来报告致命错误,它会停止当前控制流程,并引发一个运行时恐慌。例如: package main import "errors" func main() { outerFunc() } func outerFunc() { innerFunc() } func innerFunc() { panic(errors.New("an intended fatal error")) } 程序执行后的结果为: D:\gotest>go run main.go panic: an intended fatal error goroutine 1 [running]: main.innerFunc(...) D:/gotest/main.go:14 main.outerFunc(...) D:/gotest/main.go:10 main.main() D:/gotest/main.go:6 +0x77 exit status 2 当调用 innerFunc 函数中的 panic 函数后, innerFunc 的执行会被停止。紧接着,流程控制权会交给调用方 outerFunc 函数。然后, outerFunc

调用约定

点点圈 提交于 2020-02-05 03:07:29
#define CALLBACK __stdcall #define WINAPI __stdcall #define WINAPIV __cdecl #define APIENTRY WINAPI #define APIPRIVATE __stdcall #define PASCAL __stdcall 调用约定(Calling convention):决定函数参数传送时入栈和出栈的顺序,由调用者还是被调用者把参数弹出栈,以及编译器用来识别函数名字的修饰约定。 函数调用约定有多种,这里简单说一下: 1、__stdcall调用约定相当于16位动态库中经常使用的PASCAL调用约定。在32位的VC++5.0中PASCAL调用约定不再被支持(实际上它已被定义为__stdcall。除了__pascal外,__fortran和__syscall也不被支持),取而代之的是__stdcall调用约定。两者实质上是一致的,即函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的是函数名的修饰部分(关于函数名的修饰部分在后面将详细说明)。 _stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。 2、C调用约定(即用_

函数递归调用

妖精的绣舞 提交于 2020-02-05 02:29:06
在调用函数的过程又出现直接或间接的调用该函数本身,称为函数的递归调用 递归函数需要终止条件 例1:用递归求n!. 思路:求n!可以用递推方法,即从1开始,乘2,再乘…直乘到n。这种方法 容易理解,也容易实现。递推法的特点是从一个已知的事实(如1!=1)出发,按一定规律推 出下一个事实(如2!=1! * 2),再从这个新的已知的事实出发,再向下推出一个新的事实(3!=3¥2!)。n!=n* (n- 1)!。 求n!也可以用递归方法,即5!等于4!X5,而4!=3!X4…,1!=1。 例2:Hanoi(汉诺)塔问题。 这是一个古典的数学问题,是一个用递归方法解题 的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A,B.C。开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上(见图。有一个老和尚想把这64个 盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求编程序输出移动盘子的步骤。 解题思路: 需要找到一个解决问题的思路,把看似复杂的问题简单化,使问题得以迎刃而解。老和 尚会这样想:假如有另外一一个和尚能有办法将上面63个盘子从一个座移到另一座。那么, 问题就解决了。此时老和尚只须这样做: (1)命令第2个和尚将63个盘子从A座移到B座; (2)自己将1个盘子(最底下的、最大的盘子

Python学习,第八课 - 函数

一个人想着一个人 提交于 2020-02-04 21:55:42
本次讲解函数,由于内容比较多,小编列了个大纲,主要有一下内容: 1. 函数基本语法及特性 2. 函数参数 3.局部变量 4. 返回值 5.嵌套函数 6.递归 7.匿名函数 8.高阶函数 9.内置函数 1. 函数基本语法及特性 函数的定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 函数的特性: 减少重复代码 使程序变的可扩展 使程序变的易维护 函数的语法定义 直接上代码: # def 是定义函数的关键字 def test():#test既是函数名 print('学习Python的第一个函数') test() #调用函数 同时函数也可以带参数 a, b = 1, 3 # 带参函数 def test(x, y): # x 和 y 即是在我们调用函数时传入的参数 return x + y # 返回执行的结果 c = test(a, b) # 把函数返回结果赋值给 C print(c) 2. 函数参数 在说函数参数前,大家需要了解一个知识点, 形参 & 实参 何为形参? 既变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。 因此,形参只在函数内部有效,函数调用结束返回主调用函数后则不能再使用该形参变量 何为实参? 既可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值

pyCharm调试工具的使用

杀马特。学长 韩版系。学妹 提交于 2020-02-04 17:20:07
debug调试工具的使用F8:遇到函数调用,不会进入到函数内部F7:遇到函数调用,会进入到函数内部,一步一步执行打断点:行号后面,点一下会出现一个红点,打了断点之后,使用debug模式去运行(运行到断点处会暂停) 来源: https://www.cnblogs.com/liyuna/p/12260002.html

python 类学习笔记

血红的双手。 提交于 2020-02-04 13:49:21
Python的类机制使用尽可能少的新语法和语义将类引入语言。Python的类提供了面向对象程序设计语言所有的 标准特性:类继承机制允许有多个基类,一个派生类可以覆盖基类中的任何方法,一个方法可以使用相同的名字调用 基类中的方法。 Table of Contents 1 名字和对象 2 Python的域(scopes)和名称空间(namespaces) 3 初识类 3.1 定义类 3.2 类对象 3.3 实例化对象 3.4 方法对象 4 漫谈 5 派生 6 多重继承 7 私有变量和类局部引用 8 结构体 9 异常(Exceptions)也是类 10 迭代器 11 生成器(Generators) 1 名字和对象 对象有其特性,同一个对象可以有多个名字,这与其它语言中的别名很相似。别名有时候像指针,例如将对象当做 函数参数传递的时候非常高效,因为只传递了指针,这避免了pascal中的两套参数传递机制。 2 Python的域(scopes)和名称空间(namespaces) 在引入类之前,我们讲Python的域规则。类的定义巧妙地运用了名称空间,所以你需要知道域和名称空间如何工作才能理解发生了什么。 首先从定义开始。 名称空间是名字和对象之间的映射。多数名称空间使用Python的字典来实现,但 除非出于性能考虑,我们 通常不关心具体如何实现。名称空间的例子有,内置的名称例如abs()