help(300分)

  • 主题发起人 主题发起人 xmzw
  • 开始时间 开始时间
X

xmzw

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在主程序中起一个线程去查询数据库并在主窗体中的listview中显示
,并可在主程序中单击“停止”按钮停止该线程(象金山毒霸),问题是当
起了该线程后对主窗体的操作变得很迟钝,怎样才能做得像“毒霸“那样平滑
,我已经把线程的优先级设为最低还是没什么用。
 
Borland的数据库引擎本身不是多线程的,所以应使用会话或TSession组件。
设置TSession的AutoSessionName为True。将Query和TDataBase的SessionName
都设为TSession的SessionName。
Query应通过变量送入线程中,不能与它将要用到的线程环境中的TDataSource
相连。应该只在主线程中或Synchronize方法中连接TDataSource。
 
>>设为最低还是没什么用
有多低?
 
数据库的多线程的控制权主要不在客户端这里
 
还是 Fencer 说了点有用的,cakks 竟瞎灌水。
 
那我再灌点水: Session的冲突和速度无关吧? 只会引起出错. 况且看他的问题,似乎
只有2个线程,不会有什么Session的冲突的. Session.autoname不是万金油噢!
 

同意thtfsyh的说法,我试了一下,不用数据库的话,就是起几个执行死循环
的线程也不会有这种问题
TO Fencer:我按照你的方法作了,在线程中create了TSession,TDataBase和TQuery,把Tsession的autosession属性设为true,并把后两者的sessionname都设为TSession,但好像没什么用
 
这可能是因为你操作数据库时间较长影响了线程对你的实践的响应,简单的做法是,
在你的线程的循环中加入对于结束的判断
实际上打开数据库实践并不长:
线程序里
DATASET1.OPEN;
ListView.Clear;
WHILE NOT DATASET1.EOF AND NOT EndTheaddo
begin
Synchronize(AddRecordToListView);
DataSet1.next;
end;
 
我就是这么做的,但没用,而且我试过在每用
Synchronize(AddRecordToListView)显示一条纪录后用
application.messagebox或sleep(n),但都没什么效果,
我的查询结果集较大,有可能有几千条,而且有时是通过
internet查询
 
。。。显示一条纪录后用application.processmessage才有用
 

"查询数据库慢”+“机器慢“=“迟钝”
 
试一下把数据集一次显示,(不要象liaowenjia那样),每次显示
返回用户界面很耗时。
 
我可以解决! please mail to me
 
线程等待好像用
while threadxxx.waitfor()<>do sleep();比较好.
 
多人接受答案了。
 
后退
顶部