请高手帮忙:在ctBloching,用三个线程发送队列中的数据时,为么会"连接占线"?谢谢 (200分)

  • 主题发起人 主题发起人 hcai
  • 开始时间 开始时间
H

hcai

Unregistered / Unconfirmed
GUEST, unregistred user!
系统是这样的:
共用三个Timer,第一个Timer来临控数据库中的数据,把符合条件的记录取出来,放入
队列,并且更新数据库,时间是:800毫秒。
第二个Timer来分别打开三个SOCKET的连接,创建SOCKET的过程并且创建对应的线程,
时间是:200毫秒。
第三个Timer临控接收的队列,并回写(Update...set...)入数据库,时间(200毫处)
问题:在调试时总是出现:"连接占线导至另一个命令"
 
你用TIMER本身就是失误,直接建立3个线程,用一些方式来保证他们的
同步运行,应该没有问题,
 
如果用bde,每个线程必须用单独的session和database

-----
http://www.8421.org
 
第二个Timer来分别打开三个SOCKET的连接,创建SOCKET的过程并且创建对应的线程,
时间是:200毫秒。
不知你创建的线程怎样工作的,是否200毫秒后就关闭释放了,如果没有……
 
to 张无忌
请说明白点,谢谢。
 
用Event来保证各个线程的同步
因为我不知道你的具体要求,所以不能详细的说明
找我的QQ 775033把,
 
同意qdyoung.
当BDE应用程序只有一个Session时(默认名Default)多线程使用它是不行的,除非你用其它方法
保证对它的使用是串行的(比如可用临界区)
InitializeCriticalSection(对象指针);
EnterCriticalSection(对象指针);
LeaveCriticalSection(对象指针);
或者在每个线程中自己生成独自的Session和Database
在线程中
ASession := TSession.Create...
ASessoin.AutoSessionName := True;
ADatabase := TDatabase.Create...
ADatabase.DatabaseName := xxx生成一个唯一的名字
ADatabase.SessionName := ASession.SessionName;
AQuery := TQuery.Create...
AQuery.DatabaseName := ADatabaseName.DatabaseName
AQuery.SessionName := ASession.SessionName;
这里使用AQuery控件就是线程安全的了。
... ...
或者不要用多线程操作数据库算了,多线程也不是万能的。
 
谢谢各位,
我的问题已经解决了,就是因为在三个线程中更新数据库或打开数据表格出错的,谢谢各位。
每位都得50分。
 
后退
顶部