你好,情况是这样的,我需要定时的给一个数据库的表更新一次数据,数据表有200行,50列,我用了循环给数据表赋值update,但是现在我用定时器,当定时器启动时候,我的程序就会感觉有点慢,特别是窗体的关闭,我先show了一个窗体出来,但是要点很多次关闭都关闭不了,结束程序的关闭也是,当我不启动这个定时器更新的时候,程序就没有问题,是不是更新数据太大了,还是怎样呢?是不是用到线程定时更新会好点呢?还请各位指教指教,谢谢

解决方案 »

  1.   

    启动定时器更新会很慢,是不是timer的interval设置的太小了,不停的更新?
      

  2.   

    你时间间隔是多少,timer的代码是如何写的
      

  3.   

    有可能是定時器的interval的值設置的太小,提醒樓主注意一下interval的值是毫秒!
      

  4.   

    有可能是定時器的interval的值設置的太小,提醒樓主注意一下interval的值是毫秒!
      

  5.   

    你的现象估计是:因为前一次更新没有完,你的后一次更新就又启动了你改成这样试试:进入timer事件时,先将timer disabled,在执行完更新后
    再将timer enabled。
    这样可以测试一下是不是那个原因导致的
    还有,如果你的更新是个循环,可以在循环中加上 Application.ProcessMessages 这一句试试
    看应用程序会不会响应关闭事件
      

  6.   

    7秒钟更新一次,从时间上讲可以实现你的数据更新要求
    所以不是定时器的问题而是你的更新程序的问题针对200行、50列的更新,编程的方法不同,速度可能相差数十倍甚至上百倍以上
    快的估计几秒钟搞定,慢的10分钟以上(假死)所以关键的是优化你的更新程序
    1、没有修改的数据(包括字段)坚决不更新。就是要加个判断是没有更新、部分更新还是完全更新并做相应处理
    2、循环中严禁反复打开、关闭数据集
    3、每次取的数据都是必须的数据才行,就是说无关数据不要取(取且仅取最小的、必须的数据集)
    4、修改更新的方法。直接执行Update语句来更新数据比用数据集的edit、post命令更新数据速度要快十倍以上!!!
      

  7.   

    个人建议:
    1.有采集数据进来后,进行触发.通过发消息等方法通知主程序
    2.主程序收到消息后,创建线程,把数据更新到数据库中.
    3.不要采用TIMER.
      

  8.   

    更新的时候把Timer的Enabled设为false,更新完后再设为true
      

  9.   

    其实用线程会比定时器好一点
    用线程做,可以在你采集完数据后启动线程,这样线程就可以进行处理,具体的线程:
    type
      TUpdateData = class(TThread)
      private
        { Private declarations }
        { Private declarations }
        vConnection:TAdoConnection;//adoconnection
      protected
        procedure Execute; override;
      public
        constructor Create;
        destructor Destroy; override;
      end;
    主要的方法是Execute,具体你可以查一下,和写普通的程序没有太多区别
    但是我的想的办法是:因数你的从串口上采集的数据放在了一个数组里面,你可以将这些数据存在一个临时表中,然后在数据库服务器上建一个JOB,发现有更新的内容后启动一个存储过程,你便根据临时表中的数据进行更新,把更新的操作交给服务器来做。
      

  10.   

    关闭不了的原因是因为你的更新还没有完成,可以在更新过程中加application.processs,但你要有一个状态来显示是否更新完毕,如果未更新完,不能关闭,且要用事务进行控件,防止数据丢失。
    timer.enabled := false;
    try
    .....更新的循环......
    finally
      timer.enabled:=true;//可以保证继结更新
    end;
      

  11.   

    谢谢你的回答啊,我的二维数组是real的啊,250行50列,这里是不是更新是就会比较耗资源啊?谢谢
      

  12.   

    谢谢楼上的回答,对的,我放在数据库里面还有一个目的就是本机还通过了IIS发布了网页,网站上面我是想用这个实时表的数据,所以要更新到数据表里面啊,不知各位有什么好的意见提提在下呢,谢谢
      

  13.   

    IIS!网页!
    这样吧,你建立个二进制文件,把你那一万个浮点数搁里面,然后让网页去读这个二进制文件,应该比数据库快。
      

  14.   

    你一次提交一个含200行update语句的sql,需要几秒钟?不过,最好是直接更新200x50的二进制文件,更新快
    iis的asp读取出来显示也快
      

  15.   

    哦,谢谢楼上的意见哦,如果用二进制文件存储的话,因为还没有接触过用delphi怎样写进去一个二进制文件呢,麻烦上面的兄台详细说明下啊,无限感激
      

  16.   

    二进制文件,不知道delphi的real的存储格和asp的浮点的存储格式是否一致
    可以按文本这样循环保存:write(file1,'%8.4f',[realarr[i,j]])
      

  17.   

    如果怕数据类型不一样,干脆把串口数据直接写到二进制文件里。
    要不然用double或single。
      

  18.   

    我用了循环给数据表赋值update?
    如果是ado连接,设置locktype为ltBatchOptimistic;
    可以只写一条语句,会操作所有记录,用不着循环去做,循环慢。
    7秒的时间间隔不算短。