关于事件或函数递归调用自身出错的问题

zlf19810306 2006-02-21 03:49:03
本人写了个用户事件 ue_read_updatelog()和函数 of_read_updatelog(),两者内容相同

代码为

string ls_filename,ls_log_name,ls_log_recode,ls_current_directory,ls_new_directory
ulong ll_hfilehandle
long ll_find_next,ll_close,ll_move
int i
win32_find_data lstr_find_data,lstr_dummy
i=1
is_file_time1 = ''
is_file_time2 = ''
is_log_name = ''
ls_log_name = ''
lstr_find_data = lstr_dummy
ls_filename = 'update_log\*.txt'
//find the first file and return the handle of the file
ll_hfilehandle = FindFirstFileA(ls_filename,lstr_find_data)
//get the file's name and check it
is_log_name = of_get_filename(ll_hfilehandle,lstr_find_data)
//Don't find file or the file don't fit

if is_log_name = '' then
ll_close = FindClose(ll_hfilehandle)
return
end if

ll_close = FindClose(ll_hfilehandle)
if is_log_name <> '' and mid(is_log_name,4,2) = is_db_id then
of_update_log(is_log_name)
ls_current_directory = 'update_log\' + is_log_name
ls_new_directory = 'history\' + is_log_name
ll_move = filemove(ls_current_directory,ls_new_directory)
if ll_move <> 1 then
filecopy(ls_current_directory,ls_new_directory)
filedelete(ls_current_directory)
end if
end if
this.event ue_read_updatelog()或of_read_updatelog()

作用是寻找 \update_log\ 下的*.txt文件,看文件的命名是否符合要求(of_get_filename()函数用来判断),通过of_update_log()函数将符合的文件中的数据update到数据库中.


现在出现如下问题:
我是在窗口w_export的open事件中打开,w_export窗口的父窗口为w_main.

1.当update_log文件夹中的txt文件过多时(至少多于64个)时经常会报错

2.当文件比较少的时候如30个
可顺利运行打开w_export窗口,然后关闭w_export窗口,再打开,反复2次,仍会报错

AppName: pb90.exe AppVer: 9.0.0.5507 ModName: pbvm90.dll
ModVer: 9.0.1.7275 Offset: 001a82a1

错误报告
Exception Information
Code: 0xc0000005 Flags: 0x00000000
Record: 0x0000000000000000 Address: 0x0000000010ca82a1

个人想法:个人认为是过多的递归调用,使pbvm90.dll中某些资源大量占用,不能即时释放导至

请帮忙看看是什么问题,谢谢大家了!
...全文
369 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
msgtogcra 2006-03-12
  • 打赏
  • 举报
回复
试试垃圾收集函数:GarbageCollect()
rightyeah 2006-02-24
  • 打赏
  • 举报
回复
已经不是递归的问题了。不过我也不清楚是什么情况
zlf19810306 2006-02-24
  • 打赏
  • 举报
回复
不会吧,难道没有那位高手来帮小弟一把吗
zlf19810306 2006-02-24
  • 打赏
  • 举报
回复
是否是过多的递归调用,使pbvm90.dll中某些资源大量占用,不能即时释放导至,有没有办法能强制释放内存
rightyeah 2006-02-22
  • 打赏
  • 举报
回复
这倒是很奇怪了。看来你是该好好跟踪一下了:)
zlf19810306 2006-02-22
  • 打赏
  • 举报
回复
ue_read_updatelog()改为循环


string ls_log_name,ls_filename,ls_current_directory,ls_new_directory
ulong ll_hfilehandle
long ll_close,ll_move
win32_find_data lstr_find_data,lstr_dummy


is_file_time1 = ''
is_file_time2 = ''
is_log_name = ''
ls_log_name = ''
lstr_find_data = lstr_dummy
ls_filename = 'update_log\*.txt'

ll_hfilehandle = FindFirstFileA(ls_filename,lstr_find_data)

is_log_name = of_get_filename(ll_hfilehandle,lstr_find_data)

do while is_log_name <> ''
ll_close = FindClose(ll_hfilehandle)
if is_log_name <> '' and mid(is_log_name,4,2) = is_db_id then

of_update_log(is_log_name)
ls_current_directory = 'update_log\' + is_log_name
ls_new_directory = 'history\' + is_log_name
ll_move = filemove(ls_current_directory,ls_new_directory)
if ll_move <> 1 then
filecopy(ls_current_directory,ls_new_directory)
filedelete(ls_current_directory)
end if
end if
is_file_time1 = ''
is_file_time2 = ''
is_log_name = ''
ls_log_name = ''
lstr_find_data = lstr_dummy
ll_hfilehandle = FindFirstFileA(ls_filename,lstr_find_data)
is_log_name = of_get_filename(ll_hfilehandle,lstr_find_data)
loop
ll_close = FindClose(ll_hfilehandle)


改后每处理15个文件出错一次
zlf19810306 2006-02-22
  • 打赏
  • 举报
回复
首先感谢rightyeah(众妙之门) ,正在编写循环
rightyeah 2006-02-22
  • 打赏
  • 举报
回复
说到日志,我有个日志类,很好用的,楼主要不?
rightyeah 2006-02-22
  • 打赏
  • 举报
回复
说白了就是一句话:算法不好。
循环就能简单解决的问题,不要搞得用递归这么复杂
li_d_s 2006-02-22
  • 打赏
  • 举报
回复
多写点日志,把变量,参数都写进去,看看到哪里出错
rightyeah 2006-02-22
  • 打赏
  • 举报
回复
我大概看了一下你的代码,你要做的事情是这样的吧:
在指定目录下寻找文件,找到的第一个文件做of_update_log处理,然后备份并删除它( filecopy,filedelete),回过头来再继续往下找。

精练的描述,就是:遍历指定目录下所有符合条件的文件,上传、备份、删除它。

如果确实是这样的话,我认为根本不需要用递归。简单的循环就可以了。
具体的流程如下:

开始
查找文件
do while 找到文件
上传
备份与删除
再次查找文件
loop
zlf19810306 2006-02-22
  • 打赏
  • 举报
回复
首先感谢rightyeah(众妙之门)

我是通过
if is_log_name = '' then
ll_close = FindClose(ll_hfilehandle)
return
end if
来终止递归的.

并且,在窗口w_export的open事件调用ue_read_updatelog(),如果ue_read_updatelog()是死循环,那么窗口w_export就不会显示出来.而且我在ue_read_updatelog()调用后面写了个Messagebox用来看ue_read_updatelog()是否终止,现在多数情况下是能正常结束递归,但会不定期的出错.



rightyeah 2006-02-22
  • 打赏
  • 举报
回复
楼主的递归可能有问题。
所谓递归,就是函数直接/间接地调用自己。递归还有一个必要条件,就是必须能够在适当的条件下终止递归(否则就是死循环了)。为了能够适当的终止递归,一般我们都会给函数传递一个参数,根据参数值来控制递归结束。虽然用全局变量也可以控制,但是由于递归的复杂性,请楼主检查终止条件是否合适。
另外,用递归其实并不是一个特别好的解决办法,其实还是用栈/队列加上循环更合适。
zlf19810306 2006-02-21
  • 打赏
  • 举报
回复
作用是寻找 \update_log\ 下的*.txt文件,看文件的命名是否符合要求(of_get_filename()函数用来判断),通过of_update_log()函数将符合的文件中的数据update到数据库中.
li_d_s 2006-02-21
  • 打赏
  • 举报
回复
这个函数用来干吗的?要用那么多递归?

681

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder API 调用
社区管理员
  • API 调用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧