注册 登录
编程论坛 VFP论坛

请教一下:如果查询中产生的大量CURSOR,各位是怎么关闭的?

shonken 发布于 2023-04-19 09:40, 1391 次点击
用use in select(表名)只能针对一个表

有没有办法将符合条件的表名都关闭掉,如关闭所有以“TMP”开头的CURSOR
21 回复
#2
csyx2023-04-19 10:45
自己写个循环呗
for ii = 1 to aused(aCsr)
  if like('TMP*', aCsr[ii,1])
    use in select(aCsr[ii,1])
 endif
endfor
#3
shonken2023-04-19 13:27
以下是引用csyx在2023-4-19 10:45:54的发言:

自己写个循环呗
for ii = 1 to aused(aCsr)
  if like('TMP*', aCsr)
    use in select(aCsr)
 endif
endfor


对数据工作期这个定义理解不透,没想到是用aused()。
谢谢啦~
#4
sdta2023-04-19 13:28
要养成良好的习惯,临时表用完后随时关闭,否则临时表会占用大量的内存,影响程序的运行速度。
#5
shonken2023-04-19 14:48
以下是引用sdta在2023-4-19 13:28:16的发言:

要养成良好的习惯,临时表用完后随时关闭,否则临时表会占用大量的内存,影响程序的运行速度。


是啊,基本都是用完就关闭临时表,最近的有个算法会产生一个序列的临时表,一个个的关闭就太烦了,才找方法
#6
xuminxz2023-04-20 09:07
我的习惯是,尽量少在不同事件、过程中使用同一临时表;用在过程或事件内部使用的临时表,可以用同一个表名。
#7
cjtang2023-09-19 17:18
用use in select(表名),只是关闭了临时表而矣,实际上内存还是没有释放.
不知道各位大侠有好的解决办法吗?
#8
吹水佬2023-09-19 21:12
use in 表内存应该是释放了,只是未清除内存数据。

[此贴子已经被作者于2023-9-19 21:14编辑过]

#9
z126892023-09-20 09:36
跟着各位学习
#10
tjdeming2023-09-20 10:17
回复 楼主 shonken
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
在vfp6.0下显示错误提示,不知道错在哪儿了?
#11
tjdeming2023-09-20 10:27
回复 8楼 吹水佬
只有本站会员才能查看附件,请 登录
没有成功,不知道错在哪儿了?求教!
#12
laowan0012023-09-20 10:34
use in nnn
试一下

[此贴子已经被作者于2023-9-20 10:36编辑过]

#13
tjdeming2023-09-20 11:01
回复 12楼 laowan001
谢谢你,试了试,成了! 但不懂意思。
#14
laowan0012023-09-20 11:41
以下是引用tjdeming在2023-9-20 11:01:10的发言:

谢谢你,试了试,成了! 但不懂意思。

看看帮助吧,我一直是这样用,前面说的方法我没用过
use 表名 in 0    && 在一个空闲工作区打开表
use in 表名    && 关闭指定表名的表或cursor
#15
tjdeming2023-09-20 11:45
回复 14楼 laowan001
谢谢你,那前面加select是啥意思呢
#16
csyx2023-09-20 11:53
菜鸟才直接用 use in nnn 关闭表,只有在命令窗口或简单示例情况下才这样写,安全写法是
if used('nnn')
   use in nnn
endif

老鸟都会这样写的
use in select('nnn')
这样无论 nnn 是否打开都能正常运行且不报错
#17
tjdeming2023-09-20 13:14
回复 16楼 csyx
我又试了,老鸟写的确实不报错哎,太牛了。收藏起来,今后临时表用后就添上这句
Use in select(“临时表名")
#18
cjtang2023-09-20 14:17
测试了一下
use in 后内存仍然没有释放掉.
比如某个cursor有大量数据,用了use in 后内存占用没有任何变化
#19
easyppt2023-09-20 16:50
还没没太注意,临时表cursor 关闭后,内存不会释放吗??如果是这样的话,程序操作的时间越长,内存必然就会越大了
#20
吹水佬2023-09-20 20:52
以下是引用cjtang在2023-9-20 14:17:45的发言:

测试了一下
use in 后内存仍然没有释放掉.
比如某个cursor有大量数据,用了use in 后内存占用没有任何变化

应该是释放了吧,否则VFP还能活下去?
“内存占用”是系统管理的吧,VFP只能将不用的交还系统管理(释放),而不能处理“内存占用”情况。
系统管理内存是按系统的方法处理,不一定VFP释放了就要即时反映出来。为提高内存管理效率,很多时系统只打个标记。
#21
bbschf2023-09-21 05:35
这个铁子讨论得好

如果vf系统中不执行系列内存管理命令,所释放的表十有八九仍然在内存中,只是“声明”放弃对该表的使用,操作系统会根据堆栈,从“上”到“下”一层”“一层”释放。或者在没有被释放之前,又产生同名称的临时表将之前的覆盖,bt比原表大的,内存继续“堆”,比原表小的,余留的内存空间就不会被任何“人”使用,直到完全被释放为止,(后来就出现什么《内存管理》)。
   正常情况下,高级的平台语言是不需要涉足内存管理,内存不够硬盘来凑.只有低级的计算机语言才需要干涉内存。
#22
laowan0012023-09-21 07:55
我的原则是,打开了表,用完了就主动关闭
如果用use in 表名,可能会出错,那也说明之前的程序可能有问题,但如果用了use in select(表名),确实不报错了,但会掩盖一些错误,造成程序隐藏一些不易被发现的错误
1