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。考虑三个因素:客户机内存占用、读取效率(重复使用和重新加载的效率肯定不一样)、以及查询结果刷新的问题。

 

posted @   functionMC  阅读(284)  评论(1编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示