有一窗体在初始化数据时,需要一段较长的时间,由于初始化数据部分不管放到窗体的
Create事件中,还是放到Show事件中。运行起来总觉得程序太慢了(注:我也知道是初始化函数部分必须从服务器中查询、取数据导致程序运行慢)。这对用户来说不是一个好消息。
 
这个窗体中有一个StringGrid控件,初始化后的数据就放在这控件里。如果初始化函数部分放到窗体Create事件或Show事件中,由于数据的安全性差和函数的不稳定性在程序运行中有可能导致整个程序不稳定性。我的想法是等窗体显示完毕后,再自动初始化数据。就算初始化函数需要时间,用户对程序速度变化上感觉不大。初始化数据也可慢得一条条地把数据导入到StringGrid控件中,这也可以让用户接受。如果让用户看到从调用到看到窗体出现花很长的时间的话,这用户肯定不会接受。简单来说,初始化函数我不想放到窗体Create事件或Show事件中,而是想等窗体完全显示出来后,再自动调用初始化函数.

解决方案 »

  1.   

    可以在SHOW事件的同时加一个进度显示,以让用户知道正在进行初始化
    或启用一个线程来进行初始化工作。
      

  2.   

    你可以用一个TIMER控件来做,设置一个定时,在你的SHOW事件后的多长时间后再执行这个初始化事件
      

  3.   

    不要放到show事件里,那样每当窗体show一次的话都会调用,系统就存在隐患建议你用线程来实现,在OnCreate事件里创建一个线程,用线程来实现初试化
      

  4.   

    在FormCreate中启动一个新的线程来实现。
      

  5.   

    最简单的办法用一个Timer控制,预计从Crate开始到显示出来大概1.5秒,这是开始初始化数据。方法二,用多线程,窗体Create以后就打开后备线程读取数据内容,这时候DataSource的Enabled设置为False,这样就阻断了向显示元件提交数据。等到读取完毕,线程也可以结束了,结束之前,把DataSource的Enabled设置为True,就会显示数据了。但是要考虑这些情况:1、对于某些方式下,数据集元件是根据数据元件的请求来读取的,比如一个DBGrid当前显示了5条记录他就会只要求读取5条,数据集元件也不会去多读取。通常在用BDE的时候会这样。
    2、对于ClientDataSet可以控制返回数据包的大小,根据需要向服务器端申请数据。方法三,在数据集元件读取的时候,比如在OnScroll或者OnFilterRecord的时候,调用Application.ProcessMessage,这样用户界面就可以得到及时地响应,看上去不是死掉了一样。这样需要防止在数据集元件还在读取得时候,用户就开始操作。以上方法,比较好的就是控制数据包大小的方式,不过这种方式写程序很啰嗦。但是也可以简单的就是设置一下数据包的大小就不管了,数据元件回自己处理的,极端情况设置为1,这样就是一条一条的读取,对服务器的压力比较大。但是,在Com+作为服务器端的时候,需要自己在客户端和服务器端书写代码,因为Com+不能保证客户和服务Com的对应和持续链接,你需要告诉服务器当前需要的究竟是那条记录,服务器端也必须自己处理,这都在OnGetRecord事件中处理,把信息封装在OwnerData中。