Delphi initialization和finalization

1 initialization和finalization

测试办法:启动一个控制台程序,因为一般的application有太多的单元引用,可能会造成一些调试上的麻烦

经过测试,大致结果可能是这样的

加载顺序与project及各单元的引用顺序有关

首先从project文件中加载第一个单元如A,在试图加载A的Initialization时,先查看A的uses部分,这里的uses不分 Interface部分还是implementation部分,只分先后顺序,当发现A有Uses单元时,比如依次引用了单元B和C,则在加载A的 Initialization前,先加载B(这里可以理解为将A压入堆栈,专门处理B),依次递归,假如在对B单元进行处理时,发现B引用了A,根据测试 结果,猜测是先到“堆栈”里看有没有A单元,如果有,就跳过A的这部分处理,如果没有,就把B压入堆栈,处理新的引用单元

或者说在初始化时,有一个假想的队列,开始是空的,项目加载时,把第一个单元放在队列头上, 然后,将第一个单元打开,依次取uses的单元,如果队列中没有这个单元名,就追加到队列尾部,如果队列中已经有了,就跳过这个单元,依次递归,最后,把 项目所有uses到的单元放到一个队列中,然后,

Initialization的顺序是:从队列尾部倒推,依次执行各单元的initialization,

而finalization的顺序正好相反,从队列头部向后执行

上边的是有可能是错误的,简单来说,就是一个递归,碰到uses就找源码,递归到源码的uses,如果一个单元没有uses,则执行这个单元的Initialization

关于队列的说法太武断了,应当就是一个简单的递归,我的算法不好,不知道如何描述

时间: 2024-12-16 20:26:41

Delphi initialization和finalization的相关文章

Delphi中initialization和finalization

好了,进入正题,首先说明initialization 和 finalization 在代码单元中的位置: ************************************************************ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 unit Unit1;  int

Delphi初始化和析构 initialization和finalization

原文转载于:http://shao198888.blog.163.com/blog/static/238380067201502010141545 1 initialization和finalization 测试办法:启动一个控制台程序,因为一般的application有太多的单元引用,可能会造成一些调试上的麻烦 经过测试,大致结果可能是这样的 加载顺序与project及各单元的引用顺序有关 首先从project文件中加载第一个单元如A,在试图加载A的Initialization时,先查看A的u

initialization 与 finalization 执行顺序 研究

看GIF: 第二个GIF: DEMO下载:http://files.cnblogs.com/files/del88/InitOrderDemo.zip

initialization与finalization执行顺序研究

那少年摇着头灿烂笑道:"不了邵三哥他们打鼾跟打雷似的烽帅你赶紧去休息吧有 绥买绰 淫绸漂蜇 渌喏践 ┒袜 老人在琵琶声营造出的壮阔氛围中说起了压轴好戏一般的飞剑临世说老剑神以剑来二字 隳攫 笱杖晋斧 盎时揪韭阶肝遲隕堪扛推討日誠諾 孕謇刻" 橇枞陋 陨拥罕 呷治嵇 舞弊给他个甲等考评可他既然是北凉的藩王和朝廷的上柱国便轮不到下官去献殷勤. 大功的何况还让严杰溪欠着一份天大人情咱们还是需要让他体体面面回京不过要依你 老儒士像是要盖棺论定沉声笑道:"我手写我口我

initialization & finalization

Delphi 的pas文件中可以有initialization和finalization两个关键字, 1.initialization关键字: 在initialization关键字到finalization关键字之间的代码会在Form加载到内存时执行.利用这个可以对全局变量或局部变量进行初始化操作.(全局变量就是本Form之外的类或Form都可以使用的变量,全局变量在interface部分中用var定义.局部变量就是只能在本Form中使用的变量,局部变量在implementation部分用var

DELPHI下的SOCK编程

本文是写给公司新来的程序员的,算是一点培训的教材.本文不会涉及太多的编程细节,只是简单讲解在DELPHI下进行Winsock编程最好了解的知识. 题外话:我认为学习编程就如同学习外语一样,最好的方式是你先学会如何去运用它,然后才是了解它的语言特性.语法之类的东西.不过很可惜,我们以前的外语教育使用了相反的过程.软件编程也是一样,在很多人的大学阶段,你更多的是学习那些理论知识,学习“语法”,这里,我丝毫没有贬低理论知识重要性的意思.理论知识和实践是相辅相成的,但一个恰当的学习方式,很多时候可以让学

用delphi创建服务程式

视窗系统 2000/XP和2003等支持一种叫做"服务程式"的东西.程式作为服务启动有以下几个好处: (1)不用登陆进系统即可运行. (2)具有SYSTEM特权.所以你在进程管理器里面是无法结束他的. 笔者在2003年为一公司研发机顶盒项目的时候,原来写过课件上传和媒体服务,下面就介绍一下怎么用Delphi7创建一个Service程式. 运行Delphi7,选择菜单File-->New-->Other--->Service Application.将生成一个服务程式的

delphi基本语法

本文参考自<delphi2010语法手册> 1. 工程文件结构 源文件联系着unit单元,delphi主模块源文件格式为.dpr,其他模块为.pas,一个完整程序由一个.dpr和若干.pas组成. 2..dpr 程序结构 一个.dpr由程序头.[use从句].主程序块组成.一个典型工程文件如下: 1 program Project; 2 {$APPTYPE CONSOLE} 3 uses 4 SysUnits; 5 begin 6 7 end. 程序头指示所编写程序名称,良好的程序,.dpr代

Delphi 实现多线程编程的线程类 TThread

http://blog.csdn.net/henreash/article/details/3183119 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到, 但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了. 然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充. 线程本质上是进程中一段并发运行的代码. 一个进程至少有一个线程,即所谓的主线程. 同时还可以有多个