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语言中的内存指针相似性(一)的更多相关文章

  1. js课程 3-10 js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么

    js课程 3-10  js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么 一.总结 一句话总结:js中是对象点方法的形式,这些方法都是对象的方法,而在php.java中却不是这样. 1.j ...

  2. 计算机中的大小端模式及C语言中如何鉴别他们

    我的博客:www.while0.com 参考http://blog.csdn.net/ce123_zhouwei/article/details/6971544 写的很详细. 大小端主要是对数字类型来 ...

  3. SQL Server 内存中OLTP内部机制概述(四)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  4. SQL Server 内存中OLTP内部机制概述(三)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  5. SQL Server 内存中OLTP内部机制概述(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  6. SQL Server 内存中OLTP内部机制概述(一)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  7. Linux 内存机制详解宝典

    Linux 内存机制详解宝典 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于 ...

  8. 【转】Android内存机制分析1——了解Android堆和栈

    昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题.以前也出现过这个问题,那时候并没有深究.这次打算好好分析一下Android的内存机制. 因为我以前是做VC+ ...

  9. Android内存机制分析——堆和栈

    昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题.以前也出现过这个问题,那时候并没有深究.这次打算好好分析一下Android的内存机制. 因为我以前是做VC+ ...

随机推荐

  1. gin的源码解读4-gin的路由算法

    gin的路由算法 gin的是路由算法其实就是一个Trie树(也就是前缀树). 有关数据结构的可以自己去网上找相关资料查看. 注册路由预处理 我们在使用gin时通过下面的代码注册路由 普通注册 rout ...

  2. Java继承的概念与实现

    // 方法 public class Demo { public static void main(String[] args) { Teacher t = new Teacher(); t.name ...

  3. Git算不算程序员的必备技能?

    作者:慕课网链接:https://www.zhihu.com/question/41667536/answer/486640083来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  4. 学习MyBatis必知必会(6)~Mapper基础的拓展

    一.typeAlias 类型别名[自定义别名.系统自带别名] 1.类型别名:为 Java 类型设置一个缩写名字. 它仅用于 XML 配置,意在降低冗余的全限定类名书写 2.配置自定义别名: (1)方式 ...

  5. HowToDoInJava 其它教程 1 &#183; 翻译完成

    原文:HowToDoInJava 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 学习资源 目录 Maven 教程 如何在 ...

  6. CF Round #669 Div2

    A 可以发现不论往怎样一个串往后加上两个 \(0\) 或两个 \(1\) 其奇数位和偶数位上的差值都是相同的.因此我们两位两位考虑这个 \(01\) 串,对于相邻两位相同那么直接留下,否则留下 \(0 ...

  7. G1垃圾收集器

    G1(Garbage-First) G1是一种服务端应用使用的垃圾收集器,目标是用在多核.大内存的机器上,它在大多数情况下可以实现指定的GC暂停时间,同时还能保持较高的吞吐量. 特点 压缩空闲空间不会 ...

  8. Java 书写规范简单整理

    本文带有华为Logo的PPT图片,引自:华为云课堂 目录 Java基础语句使用规范 选择结构 switch 默认要有default分支 注意break的使用 如果使用枚举,并且选项已全部列出,可以没有 ...

  9. 一键部署lamp 脚本

    一键部署lamp 脚本 如下: #!/bin/bash systemctl stop firewalld systemctl disable firewalld setenforce 0 #----- ...

  10. k8s之Dashboard插件部署及使用

    k8s之Dashboard插件部署及使用 目录 k8s之Dashboard插件部署及使用 1. Dashboard介绍 2. 服务器环境 3. 在K8S工具目录中创建dashboard工作目录 4. ...