TIMER控件本身就相当于一个循环,这样每秒一千次再乘以你SUB里的FOR哇。。不慢才怪

解决方案 »

  1.   

    在循环之间加doevents??
    什么意思?
    怎么做?
    谢谢!
      

  2.   

    下面的程序是加上Doevents,但这不是根本,因为你程序很慢,所以怎么改都是很慢的。
    你可以使用ImageList控件,在程序开始时把图片全部都读入内存,这样可能快一些.For j = 1 To 3
    Do
    Data1.Recordset.MoveLast
    con = Data1.Recordset("number") + 1
     LG = Int(Rnd * con)
     
     
     
        Data1.Recordset.MoveFirst
        Data1.Recordset.Index = "0165"   Data1.Recordset.Seek "=", LG, 0
       
      Doevents'这里加上Doevents
     Loop While Data1.Recordset.NoMatch = True
     
     Call fact(Data1.Recordset("card"), Int(j))Next
      

  3.   

    我试了一下 Doevents 速度提高不是很快
    请问还有什么方法?
    请问我还应该怎样改进我的程序
    惭愧呀,写出这么慢的程序!
      

  4.   

    Private Sub Timer1_Timer()
    If intz = 1 Then
        For j = 1 To 3
            Do
                Data1.Recordset.MoveLast
                con = Data1.Recordset("number") + 1
                LG = Int(Rnd * con)
                Data1.Recordset.MoveFirst
                Data1.Recordset.Index = "0165"
                Data1.Recordset.Seek "=", LG, 0
            Loop While Data1.Recordset.NoMatch = True
            Call fact(Data1.Recordset("card"), Int(j))
        Next
     End If
    End Sub
    ----------------------------------------------
    在你的这段代码里面,可能运行速度很慢。特别是数据库操作方面的。
    为什么不把它转换为SQL语句呢?
      

  5.   

    把movelast 和movefirst 语句移动到循环以外!
     不要每个循环都先movelast再movefirst,这当然会很慢!
      

  6.   

    这种慢总是相对难免的,以上说的都是一些方法,可是我们以后的程序难免不会有更慢的,我建议最好用一个进度条+doevents,这样让用户看到程序是在进行可不是没有响应!
      

  7.   

    空间换时间。
    从磁盘中加载图片是很费时的,这是瓶颈。
    在程序启动的时候把所有的图片加载到内存中。
    然后以后每次都取内存中的图片进行显示。
    加DoEvents并不会加快速度,相反会稍微降低速度,但是DoEvents还是很有用的,因为可以让窗口及时画出新的图片。
    这里的DoEvents没有必要放在循环之中,因为三张图片是一起显示的,所以应该放在循环之外,这可以稍微提高性能(但不明显),其实如果Timer控件的Interval足够大(>图片加载绘制时间),可以不使用DoEvents,如果你采用我所说的预先加载图片的方法,那么这里的加载时间为0,而绘制时间也非常的短,因为只有3张图片时间因该小于Interval,所以DoEvents可以去掉。
    另外,还有那个随机抽取的FOR循环可以进成:
    For j = 1 To 3
    Do
      con = Data1.Recordset.RecordCount
      LG = Int(Rnd * con)
      Data1.Recordset.Move LG, AdBookFirst
      Call fact(Data1.Recordset("card"), Int(j))
    Next
    这下就只剩下一重循环了。
    试试看,够快了吗?重点在图片的预加载。
      

  8.   

    给你一点建议:
    首先预加载图片
    然后在随机抽取中先随机取三个数,再用SQL查询出三条记录,最后显示,这样应该够快了
      

  9.   

    谢谢,各位高手给我的建议我都试了一下,
    对速度确实有一定的改善,
    我觉得还是预加载图片能够改善速度,
    但是我不会做呀,那位给个范例好吗?
    我是在数据库取出三条记录中的“card”字段
    并把每一位数都用一幅gif图片显示出来
    如在窗口中显示
     30005677854788        '每一位数字都是一幅图片,例如8就是8.gif'
     20003453346453
     30005395949545
    怎样才能实现预加载图片呢?
    帮帮我,我很急呀!!谢谢!!!
      

  10.   

    你可以把代码发到我的EMAIL:[email protected]
    我给你来优化
      

  11.   

    怎样才能用imagelist预加载图片后
    使用image 控件数组 调用imagelist预加载的图片呢???
      

  12.   

    用imagelist可以预加载图片
    但是怎样可以把他与image相关联,调用加载的图片??
    例如
    我在imagelist中加载1.gif,2.gif......9.gif,a.gif,j.gif,m.gif
    但是怎样可以把他与image相关联,调用加载的图片??
      

  13.   

    对于这个问题我又开新贴了,现在有200分啦!!
    解决imagelist可以预加载图片与image相关联问题的朋友
    一定给加分!!!
    或者用别的方法做到
    在程序启动的时候把所有的图片加载到内存中。
    然后以后每次都取内存中的图片进行显示。
    也有分呀!!
    欢迎大家来交流,解决这个问题,
    谢谢!!!!!!!!!!!!!!!!!!!
      

  14.   

    搞了半天,你又卡在了图片预加载上面啦?
    其实这个十分简单,根本不用ImageList控件,只要用一个Object数组就可以啦!比如:你有0 - 9 共十张图片。定义一个Form全局的Object数组:
    Private Pics(9) As Object在启动的时候加载这十张图片(0.gif - 9.gif):
    Private Sub Form_Load()
    Dim i as integer
      for i=0 to 9
        Set Pics(i)=LoadPicture("c:\165彩票\pic\" & cint(i) & ".gif")
      Next
    End Sub
    这样就实现了十张图片的预加载。
    使用的时候:
       Set Images(i)=Pics(n)  '这里n代表要显示的数字0 - 9
    是不是很简单啊?你哪200分在那里?给我吧?