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. Spark-寒假-实验3

    1.安装 Hadoop 和 Spark 进入 Linux 系统,参照本教程官网"实验指南"栏目的"Hadoop 的安装和使用",完成 Hadoop 伪分布式模式 ...

  2. 【记录一个问题】云风的协程库 c conroutine无法在android下链接通过

    链接出现以下错误: coroutine.c:139: undefined reference to `getcontext' coroutine.c:146: undefined reference ...

  3. Cesium中级教程3 - Camera - 相机(摄像机)

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Camera CesiumJS中的Camera控制场景的视图.有 ...

  4. vue学习14-自定义组件添加属性

    <!DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-8'> <meta http ...

  5. MySQL数据库本地事务原理

    在经典的数据库理论里,本地事务具备四大特征: 原子性 事务中的所有操作都是以原子的方式执行的,要么全部成功,要么全部失败: 一致性 事务执行前后,所有的数据都应该处于一致性状态---即要满足数据库表的 ...

  6. python3 .format()函数

    Python 3.5.2实验 >>> print('{0},{1}'.format('kzc',18) ) kzc,18 >>> print('{},{}'.for ...

  7. Nginx命令(全局配置文件与模块)

    目录 一:Nginx命令 二:Nginx全局配置文件 1.nginx全局配置 2.过滤出Nginx 三:Nginx网址模块(解析) 一:Nginx命令 1.-v : 打印版本号 [root@web01 ...

  8. ubuntu memcached安装与配置

    转载请注明来源:https://www.cnblogs.com/hookjc/ 关于Memcache与memcachedMemcache是项目名,memcached是服务名.让很多初接触的人感觉很是莫 ...

  9. MySQL 数据库高级操作 (配图)

    MySQL数据库高级操作 1.一键部署mysql 数据库 2.数据表高级操作 3.数据库用户管理 4.数据库用户授权 1.首先一键部署mysql 数据库 : 可以看我之前的博客 https://www ...

  10. 使用Hot Chocolate和.NET 6构建GraphQL应用(8) —— 实现Mutate添加数据

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在讨论完GraphQL中的查询需求后,这篇文章我们将演示如何实现GraphQL中的数据添加任务. 思路 在G ...