windev中的内存机制及其与C语言中的内存指针相似性(一)
windev中的内存机制,是初入windev世界必须要越过的一道高山,以下我的理解和经验未必都对,如有错误或遗漏,以后再纠正或补充!另外,以下内容,咱先谈应用,再说对机制的认识和理解。
一、新建表单,为什么要先Hreset?
如果当前窗口有表格类控件(Table/ListBox/ComboBox),且内容使用了数据表( display the content of a data file)(注意,此处有坑,是绑定了数据表而非查询表Query)。那么,无论是使用Loaded in memory模式,还是direct access模式,内存都将储存表格中的当前行。如果没有Hreset,FiletoScreen的时候,会把内存中的当前行显示到窗口。Hreset,官方文档的解决是以数据表设置中的默认值填充内存,可以简单的理解为设一个空记录。
二、如果表格类控制绑定的是一个查询表Query,修改表单时,发现FiletoScreen无效?
如果当前窗口有表格类控件(Table/ListBox/ComboBox),且内容使用了查询表( display the content of a query)。那么,无论是使用Loaded in memory模式,还是direct access模式,在子窗口使用filetoscreen时,非常大可能,没有数据显示。这个时候,在主窗口trace查询表的内容,当前行是有效的。原因出在子窗口的表单上,因为表单行仍然绑定的是数据表的字段。
三、HSeek后为什么经常要HCancleSeek,以及HReadSeek和HSeek有什么区别?
HSeek后,找到的记录将成为当前行,如果不cancel,其它地方用到这个数据表或查询表时,当前行将还是之前seek的那行。HReadSeek,一是要查找,二是要读取;HSeek只做查找。所以如果找到记录的话,使用HSeek后,Hfound的结果为真,Hout的结果也为真,而使用HReadSeek后,Hfound为真,Hout为假。
四、independent查询表Query和embedded查询表Query有什么区别?
无论哪种查询表,都是将数据表的查询结果存到内存中。区别在于什么时候从内存中释放,embedded是跟随控件所在窗口,independent是跟随主程序。另外要特别注意的是,查询表在第一次启动后,查询结果就储存在内存中了,如果不去改变它,再次使用它时,还是一样的结果。而要改变它,第一种方式是先释放,再使用时,就和第一次用它一样,使用新的查询条件,用函数HFreeQuery或HCancelDeclaration释放;第二种方式是绑定的表格类控制,用TableDisplay的taReExecuteQuery,强制刷新;第三种方式适用于有参数的查询,重新传递一次参数,就能以新的查询条件刷新查询结果。
说完以上四点,咱们开始总结一下机制,以下机制很多都是个人的推断,未得到官方确认,仅做参考:
1、我们先定义几个东西:
(1)服务器上存放数据表的硬盘内存及其地址,这是远程的,服务器上数据在硬盘与内存之间的读取,咱们不考虑
(2)客户机上存放缓存数据表的内存及其地址,这是本地的
(3)指向服务器硬盘内存地址的指针
(4)指向客户机缓存内存地址的指针
(5)客户机缓存数据与服务器硬盘数据之间的关系指针
2、使用数据表两种方式的区别:
(1)Loaded in memory模式,将服务器上的数据表缓存到客户机上,同时存在一个客户机数据与服务器数据之间的关系指针。因为数据缓存到本地,所以速度上更快,但对数据表的更新,应该是先更新客户机内存上的数据,然后通过关系指针理新服务器硬盘上的数据。至于缓存数据什么时候回收?相关文档没有看到,推荐应该是在程序关闭后。所以,数据有更新的话,要用tabledisplay强制更新。
(2)direct access模式,直接通过指向服务器的指针读取和更新。这种模式下,读取数据是根据当前界面的行数一页页下载读取的,滚动条向下翻一页,再动态加载一页。所以这种模式,数据更新是实时的,比如拉动一下滚动条。
3、查询表和数据表的Loaded in memory应该比较像,首次启动查询后,查询结果将储存在客户机的缓存内存中,直到关闭窗口或关闭程序或强制释放时,才会消失。
4、一定存在一个内存指针这个东西,而且有可能存在三种内存指针,一是指向客户机缓存数据的指针,二是指向服务器硬盘数据的指针,三是缓存到客户机内存数据与服务器硬盘数据之间的关系指针。所以,要特别注意使用完HFSQL的seek、position、reset,表格单选、多选(TableSelectToFile)等之后,指针在哪。不知道这个内存指针和C语言中的内存指针的机制,是不是一样,但至少还是比较相似的。windev中的内存指针更像是C或C++,需要自己管理。
5、选择问题:
(1)总表用数据表,还是查询表?如果这个总表涉及到新增、修改、删除等操作,就用数据表,如果只是单纯的结果查询,就用查询表;
(2)数据表用Loaded in memory还是direct access?大多数情况下,应该使用Loaded in memory,10万条数据量应该够了,根据需要设置好排序。要看所有数据目录的情况,应该会比较少
(3)查询表用independent还是embedded模式?如果只是窗口专用的,建议用embedded,如果是多个地方会使用到的,可以用independent。考虑三个因素:客户机内存占用、读取效率(重复使用和重新加载的效率肯定不一样)、以及查询结果刷新的问题。
windev中的内存机制及其与C语言中的内存指针相似性(一)的更多相关文章
- js课程 3-10 js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么
js课程 3-10 js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么 一.总结 一句话总结:js中是对象点方法的形式,这些方法都是对象的方法,而在php.java中却不是这样. 1.j ...
- 计算机中的大小端模式及C语言中如何鉴别他们
我的博客:www.while0.com 参考http://blog.csdn.net/ce123_zhouwei/article/details/6971544 写的很详细. 大小端主要是对数字类型来 ...
- SQL Server 内存中OLTP内部机制概述(四)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- SQL Server 内存中OLTP内部机制概述(三)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- SQL Server 内存中OLTP内部机制概述(二)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- SQL Server 内存中OLTP内部机制概述(一)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- Linux 内存机制详解宝典
Linux 内存机制详解宝典 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于 ...
- 【转】Android内存机制分析1——了解Android堆和栈
昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题.以前也出现过这个问题,那时候并没有深究.这次打算好好分析一下Android的内存机制. 因为我以前是做VC+ ...
- Android内存机制分析——堆和栈
昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题.以前也出现过这个问题,那时候并没有深究.这次打算好好分析一下Android的内存机制. 因为我以前是做VC+ ...
随机推荐
- 【记录一个问题】thanos receiver在tsdb切换期间,导致remote write接口失败增加
如图:配置了thanos receiver落盘的时间周期为10分钟,结果导致在切换tsdb期间,remote write接口的失败率增高. 目前看来,解决办法就是上游增加重试.
- 华为matebook x pro蓝屏和拆机更换固态硬盘
华为老版本的笔记本电脑现在总是蓝屏. 情况 原因 我个人认为是建兴的固态硬盘的缘故. 我的笔记本几乎没用过,因为考研.如果玩游戏使用的老ThinkPad S5.matebook我这个丐版因为没有独立显 ...
- nginx的fastcgi配置
首先参考了一份配置注释(来自"小刚的博客"): #运行用户 user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错 ...
- openSUSE修改grub来修复对win8的引导
前言:继上一次安装试用各版本linux发行版后,由于做项目将机器纯windows了一把,现在又想安回centos,各种挫折折腾两天玩残一个u盘日,其中包括自己本本的原装系统也崩了,各种泪奔,下面记录一 ...
- 强化学习实战 | 自定义Gym环境之扫雷
开始之前 先考虑几个问题: Q1:如何展开无雷区? Q2:如何计算格子的提示数? Q3:如何表示扫雷游戏的状态? A1:可以使用递归函数,或是堆栈. A2:一般的做法是,需要打开某格子时,再去统计周围 ...
- Mongodb全备+增备+oplog恢复误删数据
此时测试表中有7条数据,做个全备. 全备: mongodump --host=192.168.43.43 --port=37017 --oplog --out=/opt/mongo/fullbacku ...
- SharePoint Online 为Modern Page添加脚本
前言 众所周知,如果我们想向SharePoint 页面添加脚本,最方便的便是经典页面,添加方式主要有内容编辑器Web部件或者直接使用SharePoint Designer. 但是,如果页面是Moder ...
- JavaScript 中如何将日期格式化为 DD/MM/YYYY
在 JavaScript 中要将日期格式化为 dd/mm/yyyy .需要遵循以下步骤: 使用 getDate().getMonth() 和 getFullYear() 方法获取特定日期的日.月和年. ...
- AT2272 [ARC066B] Xor Sum
我们可以知道异或可以看成不进位的加法,那么我们就可以得到 \(a + b = a\) ^ \(b + ((a \& b) << 1)\),不难发现 \(\frac{v - u}{2 ...
- [NOI2020]命运
显然直接计数是不好计的,只能从 \(dp\) 这个角度来下手. 首先用最原始最直接的方法,直接在 \(dp\) 的过程中满足题目的要求. 既然问题给在一棵树上,那么必然和树脱不了关系,因此我们应该从树 ...