M
maming
Unregistered / Unconfirmed
GUEST, unregistred user!
如果你碰到那些很早就使用电脑的用户?他们的机器很早,可电脑水平很高。
所以要求高得很,不过这个问题我觉得很正常,我也很想实现这种技术
"做三层的应用时,在LAN中很好,联接数据库,打开数据表,保存数据都很快,
根本感觉不到慢,几十个客户端也不会有问题。可如果大批量处理或是在internet
上就问题来,不是程序出错,而是在联接数据库,打开数据表,保存数据都很慢,
客户端在这三种操作时那界面就象死机,所以产生了以下想法,能不能在上面三种
操作时创建一个线程在后台执行,前面界面不死,当然要控制不能做其它的操作,
就显示一个正在(联接,打开,保存)数据的窗口,整个程序还能最小化。
甚至还要能通过这个显示的窗口中止当前的操作(联接,打开,保存);
就象在263玩游戏一样,后台的数据处理对前台的界面没有影响。可以各位大
虾早有实现了的,可否贴出来。重金酬谢!我做了数据联接的,可没有实现上面那种效果。
请试用下面的代码,就可以看到效果,可会在退出时出错,这就是我的目的
function mconnect(pointer):longint;stdcall;
begin
//这里如果用了vcl就在退出时出错;
form1.scoketconnect1.open;
end;
procedure TForm1.Button1click(sender: Tobject);
var mthreadid: Dword;
begin
createthread(nil,0,@mconnect,nil,0,mthreadid);
if mthreadid=0
then
showmessage('no thread');
end;
而当我要用clientdataset1去联接scoketconnect1时就出错了,不能打开数据。
//*************************************
我这样做的时候又有一个问题:在syconnect中说明了;
TThreadQuery1 = class(TThread) { 声明线程类 }
private
Fclientdataset: Tclientdataset;
procedure syconnect;
protected
procedure Execute;
override;{ 执行线程的方法 SocketConnection: TSocketConnection;
}
public
constructor Create(clientdataset: Tclientdataset);
virtual;
{ 线程构造器 }
end;
procedure TThreadQuery1.syconnect;
begin
{这样的话就可以实现界面不死,但不能操作它也不能用与它相联的socketconnect}
FClientDataSet.Open;
{用Form1.ClientDataSet1.Open;这样的话界面就会死但可以使用clientdataset1,和
其它的clientdataset也就是说那个与socketconnect就是正常的联接了}
end;
procedure TThreadQuery1.Execute;{ 执行线程的方法 }
begin
try
Synchronize(syconnect);
except
end;
end;
{ 线程查询类的构造器 }
constructor TThreadQuery1.Create(clientdataset:Tclientdataset);
begin
Fclientdataset := clientdataset;
inherited Create(False);
FreeOnTerminate := True;
end;
procedure Tform1.button1click(sender:Tobject);
begin
threadquery1.create(form1.clientdataset1);
end;
前面提过一次,可能没有说清楚,两次一起600分,请高手们多多指教。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=567635这是前面的问题。
所以要求高得很,不过这个问题我觉得很正常,我也很想实现这种技术
"做三层的应用时,在LAN中很好,联接数据库,打开数据表,保存数据都很快,
根本感觉不到慢,几十个客户端也不会有问题。可如果大批量处理或是在internet
上就问题来,不是程序出错,而是在联接数据库,打开数据表,保存数据都很慢,
客户端在这三种操作时那界面就象死机,所以产生了以下想法,能不能在上面三种
操作时创建一个线程在后台执行,前面界面不死,当然要控制不能做其它的操作,
就显示一个正在(联接,打开,保存)数据的窗口,整个程序还能最小化。
甚至还要能通过这个显示的窗口中止当前的操作(联接,打开,保存);
就象在263玩游戏一样,后台的数据处理对前台的界面没有影响。可以各位大
虾早有实现了的,可否贴出来。重金酬谢!我做了数据联接的,可没有实现上面那种效果。
请试用下面的代码,就可以看到效果,可会在退出时出错,这就是我的目的
function mconnect(pointer):longint;stdcall;
begin
//这里如果用了vcl就在退出时出错;
form1.scoketconnect1.open;
end;
procedure TForm1.Button1click(sender: Tobject);
var mthreadid: Dword;
begin
createthread(nil,0,@mconnect,nil,0,mthreadid);
if mthreadid=0
then
showmessage('no thread');
end;
而当我要用clientdataset1去联接scoketconnect1时就出错了,不能打开数据。
//*************************************
我这样做的时候又有一个问题:在syconnect中说明了;
TThreadQuery1 = class(TThread) { 声明线程类 }
private
Fclientdataset: Tclientdataset;
procedure syconnect;
protected
procedure Execute;
override;{ 执行线程的方法 SocketConnection: TSocketConnection;
}
public
constructor Create(clientdataset: Tclientdataset);
virtual;
{ 线程构造器 }
end;
procedure TThreadQuery1.syconnect;
begin
{这样的话就可以实现界面不死,但不能操作它也不能用与它相联的socketconnect}
FClientDataSet.Open;
{用Form1.ClientDataSet1.Open;这样的话界面就会死但可以使用clientdataset1,和
其它的clientdataset也就是说那个与socketconnect就是正常的联接了}
end;
procedure TThreadQuery1.Execute;{ 执行线程的方法 }
begin
try
Synchronize(syconnect);
except
end;
end;
{ 线程查询类的构造器 }
constructor TThreadQuery1.Create(clientdataset:Tclientdataset);
begin
Fclientdataset := clientdataset;
inherited Create(False);
FreeOnTerminate := True;
end;
procedure Tform1.button1click(sender:Tobject);
begin
threadquery1.create(form1.clientdataset1);
end;
前面提过一次,可能没有说清楚,两次一起600分,请高手们多多指教。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=567635这是前面的问题。