线程问题(插数据)(200分)

  • 主题发起人 主题发起人 shangmin
  • 开始时间 开始时间
S

shangmin

Unregistered / Unconfirmed
GUEST, unregistred user!
在我的程序中用一个进程读取本地数据记录(access)往网络上的一台服务器添加数据(SQL7.0),程序运行很正常,如果在向服务器传数据的过程中网络断开,程序也可以正常运行不会出现鼠标成漏斗形状程序中他按钮都不能用。但是如果这时候有做任何的数据查询程序就会出现鼠标成漏斗形状程序中他按钮都不能用(其他操做不会)必须要过一会儿才能恢复。最后我实验了一下将线程中的代码最简单话
query1.close;
//打开网络上的数据库(server sql7.0)和本地数据无关
query1.open;
但是情况仍旧
我的线程是访问其他数据库并没有访问本地的数据库,为什么会出现这种情况?
不知道大家听清楚没有!!!200分,不够再加










目的是如果在网络线断开的情况下程序不用受影响,
 
没太看明白!
 
我也看不明白
 
请把代码贴出来,并加点解释,呵呵。
 
没看懂,贴点代码看看
 
感觉好像不是线程的问题,是不是你在主线程打开的数据库,你去做查询的时候又去重新连接数据库去了?
 
或者是有没有做过数据库多线程应用的大虾,介绍点经验。
例如:客户端有一个线程负责向服务器传输数据,在网络出现问题时候不会影响客户端程序的运行(包括客户端查询本机的数据库)客户端数据库我是用access 用odbc连接。服务器我采用server sql7.0 。
现在我碰到的情况如下:
当客户端的数据正在向服务器传输数据时候网络断开,这时客户端的程序不会死掉,鼠标键盘还会响应,但是如果客户端的程序有作任何查询(只是查询本机的accesss数据)那程序就会死掉,要过大约2分钟才能恢复。只要不做和数据库有关的超作程序都可以正常运行。
有没有什么好的解决方案????
谢谢
 
》当客户端的数据正在向服务器传输数据时候网络断开,这时客户端的程序不会死掉
当然,多线程和单线程,只是在网络和数据库不出问题时才不一样(这时多线程可以让用户干其它操作),但是如果出了问题,程序都会等待,所以您要在多线程中做好SQL数据安全处理。
 
你在向服务器传输数据时是否在同一线程中对客户端数据库进行了操作?
 
to pwlsjm
我用一个线程只是向服务器传数据。当我在按纽的click事件中随便写个查询本地access
表时候就回处于等待状态。本地连接access是用odbc .
例如我用两个按钮A 和B
A按钮是启动向服务器传数据的线程
B按钮只是写下面语句:
(查询本机的access用odbc连接)
query1.close;
query1.sql.clear
query1.sql.add('select * from temp')
query1.open;
这时后如果先按下A按钮断开网络线,那在edit1框中还可以敲如字符。如果按下B按钮
那键盘就不能响应了必须等到A按钮的线程结束才能恢复。
如果不采用线程的话在网络断开的情况下执行向服务器传数据回出先鼠标漏斗形状键盘不能响应.
不知道大家明白了没????
请大家帮我解决一下,我想这应该是很实用的东西.谢谢!

 
试试在你的Project内引入一个Tdatabase,和Tsession,设置Tsession的AutoSessionName为true!
Tdatabase的SessionName设为Tsession自动生成的名字,一般是【Session1_1】。
然后用Tdatabase连接你的本地数据库。
Tquery的DatabaseName与Tdatabase的DatabaseName保持一致。再执行你的程序!
 
to: vecm
你说的方法我实验过了,但是不行情况依然存在
 
对了,不仅本地查询Tquery的DatabaseName与Tdatabase的DatabaseName保持一致,而且你的线程中的Tquery或Ttable都关联上Tdatabase的DatabaseName。你再试试。
 
to:vecm
不行。我如果用Tsession 那变成Tquery的dataname不 能用 了 。
是 不 是 我讲的不清楚。 例如我把网络线断开程序一启动就执行线程此时程序窗口还可以响应,但是如果我现在执行一个查询本地数据的Query,就会死掉必须等到那个线程恢复过来才可以。
难道没有人能帮我吗?
 
真奇怪,能不能把代码简单地列一下.....
 
unit Uup_dataThread;
interface
uses
Classes,mmsystem;
type
Tup_dataThread = class(TThread)
private
procedure updata;
protected
procedure Execute;
override;
end;
implementation
uses Udm;
procedure Tup_dataThread.updata;
begin
dm.SP_insert_sfjl.close;
//向服务器插数据(sql7.0)
dm.SP_insert_sfjl.ExecProc;
end;
procedure Tup_dataThread.Execute;
begin
Priority:=tpLowest;
repeat
updata;
until Terminated;
end;
end.

//下面是执行线程
procedure Tmain.BitBtn1Click(Sender: TObject);
var
up_data:Tup_dataThread;
begin
up_data:=Tup_dataThread.create(true);
up_data.Resume;
up_data.Terminate;
end;
//在网络断开的时候执行上面的线程,然后执行下面的查询语句,程序就回死掉要过一两分钟后才能恢复,如果不执行任何查询数据库语句程序还可以响应键盘
procedure Tmain.BitBtn2Click(Sender: TObject);
begin
Qjpz.close;
//select * from temp 数据哭是本机的access
qjpz.open;
end;

看看问题出在那里了?如何解决?
 
天哪!难道没人能帮的了我呀!各位帮帮忙!
 
后退
顶部