你好,情况是这样的,我需要定时的给一个数据库的表更新一次数据,数据表有200行,50列,我用了循环给数据表赋值update,但是现在我用定时器,当定时器启动时候,我的程序就会感觉有点慢,特别是窗体的关闭,我先show了一个窗体出来,但是要点很多次关闭都关闭不了,结束程序的关闭也是,当我不启动这个定时器更新的时候,程序就没有问题,是不是更新数据太大了,还是怎样呢?是不是用到线程定时更新会好点呢?还请各位指教指教,谢谢
调试欢乐多
再将timer enabled。
这样可以测试一下是不是那个原因导致的
还有,如果你的更新是个循环,可以在循环中加上 Application.ProcessMessages 这一句试试
看应用程序会不会响应关闭事件
所以不是定时器的问题而是你的更新程序的问题针对200行、50列的更新,编程的方法不同,速度可能相差数十倍甚至上百倍以上
快的估计几秒钟搞定,慢的10分钟以上(假死)所以关键的是优化你的更新程序
1、没有修改的数据(包括字段)坚决不更新。就是要加个判断是没有更新、部分更新还是完全更新并做相应处理
2、循环中严禁反复打开、关闭数据集
3、每次取的数据都是必须的数据才行,就是说无关数据不要取(取且仅取最小的、必须的数据集)
4、修改更新的方法。直接执行Update语句来更新数据比用数据集的edit、post命令更新数据速度要快十倍以上!!!
1.有采集数据进来后,进行触发.通过发消息等方法通知主程序
2.主程序收到消息后,创建线程,把数据更新到数据库中.
3.不要采用TIMER.
用线程做,可以在你采集完数据后启动线程,这样线程就可以进行处理,具体的线程:
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,发现有更新的内容后启动一个存储过程,你便根据临时表中的数据进行更新,把更新的操作交给服务器来做。
timer.enabled := false;
try
.....更新的循环......
finally
timer.enabled:=true;//可以保证继结更新
end;
这样吧,你建立个二进制文件,把你那一万个浮点数搁里面,然后让网页去读这个二进制文件,应该比数据库快。
iis的asp读取出来显示也快
可以按文本这样循环保存:write(file1,'%8.4f',[realarr[i,j]])
要不然用double或single。
如果是ado连接,设置locktype为ltBatchOptimistic;
可以只写一条语句,会操作所有记录,用不着循环去做,循环慢。
7秒的时间间隔不算短。