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。考虑三个因素:客户机内存占用、读取效率(重复使用和重新加载的效率肯定不一样)、以及查询结果刷新的问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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框架的用法!