天天看点

回调函数 句柄 消息 windows的消息机制

  回调函数: 它是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象、全局函数等)时,将一些参数传递给对象,同时将一个调用者可以访问的函数地址传递给该对象(被调用者)。这个函数就是调用者和被调用者之间的一种通知约定,当约定的事件发生时,被调用者(一般会包含一个工作线程)就会按照回调函数地址调用该函数,并向被调用者返回一个结果。这种方式,调用者在一个线程,被调用者在另一个线程。

  句柄:handle,handle的本意是把柄,把手的意思,就是一个标号。是你与操作系统打交道的东东。举个通俗的例子,比如你考上了大学,入学后,学校(操作系统)会给你一个学生证号。注意,这个号码是学校指定的,你无法自选。有了这个号码(学生证,假设一证多用)就可以享受学校提供的服务:如你就可以去图书馆借书,去食堂吃饭,去教室上课等等。但你不能到食堂里买啤酒,因为学校不允许这种服务。而在计算机中系统提供的服务就是API调用,你有了HANDLE,就可以理直气壮地向系统提出调用API的服务。而指针的权力就大多了,有了指针你可以到处去喝酒,打架,学校(操作系统)管不着,所以句柄和指针的区别在于句柄只能调用系统提供的服务。而句柄虽然是一个能相互区别的号码,但与我们普通的ID号又有区别,普通的ID号是可以由程序员自己定义的,而句柄不行,它是对象生成时系统指定的,是为了区别系统中存在的各个对象,这个句柄不是由程序员符给的。实际应用中,最常用的就是文件句柄和窗口句柄。例如,窗口句柄的值是一个长整数,每个窗体都用一个句柄来表示。所以句柄是不会重复的,很多的函数都会用到窗体的句柄。

  消息:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)组成。windows的消息机制:消息"是windows运行机制中一个基本而又重要的概念。消息是一个报告事件发生的通知,消息驱动是围绕消息的产生与处理展开的,并依靠消息循环机制来实现。 某条消息可被视为某个事件的发生,比如点击鼠标。事件即可以由用户引发,也可以由应用程序产生,当然windows本身也能发出消息。windows是一个多任务操作系统,所以没有哪一个程序能够独占系统的资源,资源都是由windows统一管理的。那么某个程序是如何获得用户的信息呢?事实上,windows在时刻监视着用户的每个举动,一旦发生了动作,就由windows捕捉而不是应用程序,windows分析该动作与哪一个程序相关,然后将动作以消息的形式发送给当前的应用程序。相反,应用程序也在时时等着消息的到来,一旦发现它的消息队列中有未处理的信息,就获取并分析该消息,并根据消息所包含的内容采取适当的动作来响应,并将结果返回给系统。 例如窗口程序,当用户点击按钮时候,这一动作被windows捕捉,并且以消息(ID和参数)的形式发给该窗口的消息队列,该窗口发现队列中有消息,就根据消息调用相应的过程进行处理,并将返回结果返回给系统。每个窗口本身都有一个窗口函数,未处理的消息就由它处理,例如拖动。 windows为每个线程维护了相应的消息队列,应用程序的任务就是不停地从特定的消息队列中获取消息、分析消息并处理消息,直到消息(WM_QUIT)为止。这个过程的程序结构称为"消息循环"。函数回调与消息机制:可以看出,消息机制是一种特殊的函数回调。因为应用程序本是调用系统函数的,但是一旦启动就等待系统发来的消息,等到消息调用相应过程进行处理,相当于系统进行了回调。所以消息机制是一种广义的函数回调。

继续阅读