请教关于在线程中使用ado往表里加记录?(200分)

  • 主题发起人 主题发起人 warestar
  • 开始时间 开始时间
W

warestar

Unregistered / Unconfirmed
GUEST, unregistred user!
我在用TServersocket和TClientSocket编程发送接收文件。
从表里读记录,根据记录中的文件名进行发送,TServersocket
负责接收,使用TServerthread.每个线程接收一个文件,接收后
网表里加一条记录。可是,用nt下的性能监视器查看,workset peak的
值不断增加,导致系统最后崩溃。我是用TADOConnection和TADOQuery
访问SQL Server数据库。应该怎么办?请高手帮忙。多谢了。



 
嘿嘿,我也做过这样的事情,但是没问题.
在线程里添加数据库,要注意几点.
1.当一个线程接收完毕,开始添加时,要设置一个排斥的信号量(或设置临界区),以使得其
它线程即使完成接收也无法马上进行数据库操作,而是先挂起等待当前操作线程完毕后才可进
行自己的操作.当然如果你是每个线程一个数据库Connection,我也没话说(好浪费阿,)也容易出
问题,绝对不推荐使用!
2.那就是这个挂起其它线程也是很有讲究的,比如一个线程接受完毕,要进行数据库操作时,
发现当前系统处于临界状态,那么一般的做法是把线程挂起一断时间(比如sleep(50)),然后从试,
不这样,你的程序的CPU USEAGE就会是嘿嘿100%,恐怖.另外进行操作的主线程在进入临界区后
,也最好先sleep一会,这样会大大降低程序的CPU USEAGE.另外还有一个问题就是,如果你的线
程在检测到系统处于临界状态后都sleep同样的时间(比如50ms),那很容易造成某几个线程老是
独占数据库连接而其它的线程饿死的状态.如果你学过操作系统理论,一定会有理解.Unix系统
采用的办法是根据等待的时间,不断提高线程的优先级别,但是这样比较麻烦.有个较简单的办法.
知道CSMA/CD么?(不知道也不要紧)他采取的办法是让一个线程等待一段随机的时间,然后在
从试的办法,这样就可以基本解决这里的某些线程饿死的问题(当然CSMA/CD比这复杂的多,它还有
什么10次回推的手段,这里没必要搞的这么复杂).也就是让它sleep一个随机值,这个随机值的
选取,我自己认为,可以以一次Delphi的ADO数据库Insert操作的时间值为参考,在几分之一次
标准操作到几次标准操作的时间左右随机,具体可以通过试验来确定.这样即可以避免线程饿死,
又可以大大降低系统Cpu占用率,也使程序的效率不因为线程的挂起而降低.
希望对你有帮助.
 
任务管理器/查看/选择列,
把线程数也加进来,看你的线程会不会光增加不减少,要是这样,估计的线程不能释放
 
接受答案了.
 
后退
顶部