以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  创建窗口句柄时出错,是个如何解决的问题?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=119340)

--  作者:kylin
--  发布时间:2018/5/23 10:16:00
--  创建窗口句柄时出错,是个如何解决的问题?

在“窗口管理”状态,选择一个窗口,点击“应用窗口”。窗口中的按钮的代码是:一个For...Next循环,中间调用某个函数在进行数据的汇总以及填写工作。

运行一半半,中途弹出这个错误提示,并停止了数据统计。同时“窗口管理”也不见了。


图片点击可在新窗口打开查看此主题相关图片如下:1527039268(1).png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:1527039299(1).png
图片点击可在新窗口打开查看
[此贴子已经被作者于2018/5/23 10:17:06编辑过]

--  作者:有点甜
--  发布时间:2018/5/23 10:23:00
--  

把代码拷贝出来,在命令窗口运行,有没有问题?

 

如果也有问题,加入msgbox或output追踪出错位置出错代码。


--  作者:kylin
--  发布时间:2018/5/23 11:55:00
--  
在命令窗口的,仍然一样出问题。

For each kh as string in...,现在是统计了一个kh,就保存一个kh的所有统计数据,检查结果,即是预期的结果,没有什么毛病。
然而多次运行仍然发现不了规律,每次程序中止的点,即每次的kh的值不同。晕死了!!!!!!!!!!

--  作者:kylin
--  发布时间:2018/5/23 11:55:00
--  
我想请教的是,这个错误提示一般会在哪个地方出问题?
--  作者:有点甜
--  发布时间:2018/5/23 12:00:00
--  

贴出你写的代码,或者做一个对应的例子发上来测试。


--  作者:kylin
--  发布时间:2018/5/23 12:08:00
--  
刚才在百度中搜索了一下这个主题,有一个答案似有所悟。分享给大家:
你在WaittingForm窗体load事件里实例化窗体本身,然后给显示出来,这本身会产生一个循环,无限的递归:
1号 WaittingForm窗体load时,实例化了2号,并显示。
2号因为是实例化的WaittingForm窗体,依然有load事件,于是load时会去实例化一个窗体3,并显示。
3号....于是无限的循环下去。
这样下去的结果就是.net的资源回收机制来不及回收所有的资源,导致资源耗尽,无法为新的窗体分配句柄,就报了这么一个错误。

我的解决方向,就是减少DataTable的加载频率,这样就不致于耗尽资源。

--  作者:kylin
--  发布时间:2018/5/23 12:12:00
--  
因为代码从各种逻辑上看是不存在问题的。而如果不了解以上这个深刻的道理,还不知道解决方向,甚至都要开始怀疑人生了图片点击可在新窗口打开查看图片点击可在新窗口打开查看
--  作者:有点甜
--  发布时间:2018/5/23 12:28:00
--  

贴出你写的代码,或者做一个对应的例子发上来测试。


--  作者:kylin
--  发布时间:2018/5/23 12:37:00
--  
原来的主要代码:
Dim fh As String
Dim tb As Table = Tables("应收账龄日报")
Dim dt As DataTable = tb.DataTable
Dim sjdt As DataTable = DataTables("月销售明细")
Dim cr As Row = Args(0)
Dim kh As String = Args(1)
Dim qrq As Date = cr("前统计日期")
Dim rq As Date = cr("统计日期")

Dim kdr As DataRow = DataTables("客户档案").Find("客户名称 = \'"& kh &"\'")
If kdr Is Nothing   \'从大逻辑上说是不可能为空,因为在此之前有应收日报统计,有关于客户归属地的强制填报
    fh = "未找到客户【" + kh + "】的归属省区!"
End If
If fh > ""  \'就是直接退出
   
Else
   
    dt.LoadFilter = "[客户名称] = \'"& kh &"\' And [报表类别] = \'客户日结\' "  \'一定要忽略"客户账龄/省区账龄/分公司账龄"这些正式报告表
    dt.Load
   
    sjdt.LoadFilter = "客户网点名称 = \'"& kh &"\' And 销售日期 > #"& qrq &"# And 销售日期 <= #"& rq &"#  "  \'在数据源很大的时候,还是会提升效率的
    sjdt.Load
   
    For Each xsrq As Date In sjdt.GetValues("销售日期") \',"客户网点名称 = \'"& kh &"\'")
       
        Dim zr As Row = tb.AddNew
        zr("日期") = xsrq
        zr("年") = xsrq.Year
        zr("月") = xsrq.Month
        zr("日") = xsrq.Day
        zr("客户名称") = kh
        zr("统计日期")  = cr("统计日期")
        zr("当前金价") = cr("当前金价")
        zr("摘要") = "货款往来"
        zr("报表类别") = "客户日结"
       
        zr("分公司") = kdr("分公司")
        zr("地理省区") = kdr("地理省区")
        zr("绩效省区") = kdr("绩效省区")
    Next
    Dim hr As Row = tb.AddNew
    hr("客户名称") = kh
    hr("统计日期")  = cr("统计日期")
    hr("当前金价") = cr("当前金价")
    hr("摘要") = Format(hr("统计日期"),"yyyyMMdd") +"统计"
    hr("报表类别") = "客户账龄"
   
    hr("分公司") = kdr("分公司")
    hr("地理省区") = kdr("地理省区")
    hr("绩效省区") = kdr("绩效省区")
   
    Functions.Execute("BillCh1")
    Functions.Execute("BillGd2")
    Functions.Execute("BillGdNtPrc3")
    Functions.Execute("BillAncFee4")
    Functions.Execute("BillSalRtn5")
    Functions.Execute("BillRtnFee6")
   
    \'以下正序轮询,结算出每日的累计欠款与欠料
    Dim qks() As String = {"应收款增加","应收款减少","应收款结余","应收料增加","应收料减少","应收料结余"}
    Dim kzr As Row = tb.Rows(0)
    For Each r As Row In tb.Rows
        If r("统计日期")  = cr("统计日期")  
            Dim brq As Date = r("日期")
            Dim sr As DataRow
            If brq = kzr("日期")
                sr = kzr.DataRow
            Else
                sr = dt.Find("日期 < #"& brq &"#","日期 Desc")
            End If
            If sr IsNot Nothing
                r("应收款结余") = sr("应收款结余") + r("应收款增加") - r("应收款减少")
                r("应收料结余") = sr("应收料结余") + r("应收料增加") - r("应收料减少")
            Else
                r("应收款结余") = r("应收款增加") - r("应收款减少")
                r("应收料结余") = r("应收料增加") - r("应收料减少")
            End If
      
        End If
    Next
End If

--  作者:kylin
--  发布时间:2018/5/23 12:38:00
--  
因为针对仅9万多条记录,总共频繁加载数据表近4000次