你必须将ADOQuery1.Open的代码放到一个线程里。
解决方案 »
- 问下简单问题。窗体上控件加载前的事件是什么??
- 各位大侠,国庆快乐!有个问题请教,设计了很多Form,打算dock到主Form,是否可行?
- 各位老大,遇到了困难, 关于支票,进帐单打印设计制作等,问题,最好有代码帮兄弟一把.
- 怎么在程序运行期间设置quickrep的自定义纸张大小,且quickrep的最新版本在哪里有下载的,请给予详细地址!
- 解决马上给分!!!-急!!!
- 请教一个简单问题,我第一次写触发器,请高手指教,谢谢!
- 大家有没有用DX系列的确那套组件,觉得怎么样,有什么特出的功能
- 如何将数字转成英文序数词? ex: 1 -> One, 2 -> Two, 21 -> Twenty-One, ....
- 如何阻止一个非数字键的录入?也就是使字母及其它符号的录入失效?
- 如何实现在csDropDownList型的ComboBox中按上下键时显示下拉列表?多谢
- 谁能告诉我为什么我这个计算出来的结果会不对?
- Delphi 数据库塞入数据和显示数据的问题!!!
除非你象楼上说的把大数据操作放到线程去处理,或者干脆把GIF放到线程中,但要注意线程和界面的问题,还要处理线程的消息循环.
所以还是推荐把大数据放到线程的方案
一是读写磁盘文件的等待时间,它比其它代码执行要慢得多。
二是读写磁盘文件代码与,后续执行代码的关系。(有时读写磁盘文件未曾完成,就开始执行后续代码,造成错误)
解决上述问题,常通过二种办法:
一是将读写磁盘文件代码列入一线程中,让它最终完成操作。
二是在读写磁盘文件代码后,加入sleep代码,它后续代码等待。如何使用只有自己权衡了。
把Gif放到线程中是不行的
MyThread := Thread.CreateAnonymousThread(
procedure
begin
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from 大数据');
Open;
end;
end);
MyThread .Start;
在执行前调用窗体,就像你拷贝文件时,会一个进度条一样……
到你查询完毕,OPEN后,将该窗体隐藏,或者释放……
cxgrid修改一个属性,然后写两行代码就OK了
这样不行的,GIF动画照样会卡死,直至查询结束
创建一个窗体,开始查询前创建窗体。窗体里放GIF显示。
查询结束时给窗体一个消息,然后窗体关闭。
//生成panel
....//查询
.open;
finally
//panel释放
end;
exe与查询函数之间通过消息传递参数显示进度exe代码如下unit uProgressbar;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls,
ComCtrls, ExtCtrls, Clipbrd;const
SetPosition_Message=WM_USER+$100;
StartBar_Message=WM_USER+$101;
StopBar_Message=WM_USER+$102;
UnloadBar_Message=WM_USER+$103;
SetMaxValue_Message=WM_USER+$104;
SetTip_Message=WM_USER+$105;
SetTipClip_Message=WM_USER+$106;
WMCOPYDATA=WM_COPYDATA;type
TfrmProgressbar = class(TForm)
pb1: TProgressBar;
lbl1: TLabel;
tmr1: TTimer;
lblTip: TLabel;
procedure tmr1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations } procedure SetPositionMessage(var MyMsg:TMessage);message SetPosition_Message;
procedure StartBarMessage(var MyMsg:TMessage);message StartBar_Message;
procedure StopBarMessage(var MyMsg:TMessage);message StopBar_Message;
procedure UnloadBarMessage(var MyMsg:TMessage);message UnloadBar_Message;
procedure SetMaxValueMessage(var MyMsg:TMessage);message SetMaxValue_Message;
procedure SetTipMessage(var MyMsg:TMessage);message SetTip_Message;
procedure SetTipClipMessage(var MyMsg:TMessage);message SetTipClip_Message;
procedure WMCOPYDATA(var MyMsg:TMessage);message WM_COPYDATA;
public
{ Public declarations }
end;var
frmProgressbar: TfrmProgressbar;implementation{$R *.dfm}procedure TfrmProgressbar.StartBarMessage(var MyMsg:TMessage);
begin
lbl1.Caption:='';
tmr1.Enabled:=true;
end;procedure TfrmProgressbar.StopBarMessage(var MyMsg:TMessage);
begin
lbl1.Caption:='';
tmr1.Enabled:=false;
pb1.Position:=0;
end;procedure TfrmProgressbar.tmr1Timer(Sender: TObject);
begin
pb1.Position:=pb1.Position+1;
if pb1.Position=pb1.Max then
begin
pb1.Position:=0;
end;
end;procedure TfrmProgressbar.SetPositionMessage(var MyMsg:TMessage);
var
MyVal:integer;
begin
MyVal:=MyMsg.WParam;
pb1.Position:=MyVal;
lbl1.Visible:=true;
lbl1.Caption:='共 '+ inttostr(pb1.Max)+' 条 / 当前第 '+ inttostr(MyVal) +' 条';
end;procedure TfrmProgressbar.SetMaxValueMessage(var MyMsg:TMessage);
var
MyVal:integer;
begin
lbl1.Visible:=true;
MyVal:=MyMsg.WParam;
pb1.Max :=MyVal;
lbl1.Caption:='共 '+ inttostr(MyVal)+' 条';
end;procedure TfrmProgressbar.SetTipMessage(var MyMsg:TMessage);
var
MyVal:integer;
strTip:pchar;
begin
MyVal:=MyMsg.LParam;
ShowMessage(IntToStr(myval));
strTip:=pointer(Myval);
lblTip.Caption:=strTip;
ShowMessage(strTip);
end;procedure TfrmProgressbar.SetTipClipMessage(var MyMsg:TMessage);
var
MyVal:integer;
strTip:string;
begin
MyVal:=MyMsg.LParam;
if MyVal=1 then
begin
strTip:=Clipboard.AsText;
Clipboard.Clear;
lblTip.Caption:=strTip;
end;
//ShowMessage(strTip);
end;procedure TfrmProgressbar.WMCOPYDATA(var MyMsg:TMessage);
var
Data : ^tagCOPYDATASTRUCT;
strTip:string;
begin
Data:=Pointer(MyMsg.LParam);
strTip:= StrPas(Data.lpData);
strTip:=Copy(strTip,1,Data.dwData);
lblTip.Caption:=strTip;
//showmessage(strtip);
end;procedure TfrmProgressbar.UnloadBarMessage(var MyMsg:TMessage);
begin
close;
end;procedure TfrmProgressbar.FormCreate(Sender: TObject);
begin
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
self.DoubleBuffered:=true;
end;end.调用显示进度exe代码如下unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
StdCtrls, Dialogs, ShellAPI;
const
SetPosition_Message=WM_USER+$100;
StartBar_Message=WM_USER+$101;
StopBar_Message=WM_USER+$102;
UnloadBar_Message=WM_USER+$103;
SetMaxValue_Message=WM_USER+$104;type
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
vH:THandle;implementation{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);
var
i:integer;
begin
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
if vH = 0 then
begin
shellexecute(self.Handle,'open',PChar(ExtractFilePath(Application.ExeName) +'ProgressbarExe.exe'),'frmProgressbar',nil,SW_SHOWNORMAL);
while vh=0 do
begin
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
end;
end; sendmessage(vH ,StartBar_Message,0,0); //此处模拟执行大数据查询
for i:=0 to 127670 do
begin
Self.Caption:=IntToStr(i);
end; sendmessage(vH ,UnloadBar_Message,0,0);
showmessage('完毕');
end;procedure TForm1.btn2Click(Sender: TObject);
var
i:integer;
intCount:integer;
begin
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
if vH = 0 then
begin
shellexecute(self.Handle,'open',PChar(ExtractFilePath(Application.ExeName) +'ProgressbarExe.exe'),'frmProgressbar',nil,SW_SHOWNORMAL);
while vh=0 do
begin
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
end;
end; intCount:=10000;
sendmessage(vH ,SetMaxValue_Message,intCount+1,0); //此处模拟执行多行读写
for i:=0 to intCount do
begin
Self.Caption:=IntToStr(i);
sendmessage(vH ,SetPosition_Message,i+1,0);
end; sendmessage(vH ,UnloadBar_Message,0,0);
showmessage('完毕');
end;end.
效果如下图
unit Unit1;interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, shellapi, Clipbrd;
const
SetPosition_Message=WM_USER+$100;
StartBar_Message=WM_USER+$101;
StopBar_Message=WM_USER+$102;
UnloadBar_Message=WM_USER+$103;
SetMaxValue_Message=WM_USER+$104;
SetTip_Message=WM_USER+$105;
SetTipClip_Message=WM_USER+$106;type
TForm1 = class(TForm)
btn6: TButton;
btn7: TButton;
btn8: TButton;
btn9: TButton;
btn10: TButton;
btn11: TButton;
btn12: TButton;
btn13: TButton;
procedure btn6Click(Sender: TObject);
procedure btn7Click(Sender: TObject);
procedure btn8Click(Sender: TObject);
procedure btn9Click(Sender: TObject);
procedure btn10Click(Sender: TObject);
procedure btn11Click(Sender: TObject);
procedure btn12Click(Sender: TObject);
procedure btn13Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
vH:HWND;
implementation{$R *.dfm}procedure TForm1.btn6Click(Sender: TObject);
var
lngS:LongInt;
begin
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
if vH = 0 then
begin
//ShowMessage('begin shell');
shellexecute(self.Handle,'open',PChar(ExtractFilePath(Application.ExeName) +'ProgressbarExe.exe'),'frmProgressbar',nil,SW_SHOWNORMAL);
lngs:=gettickcount;
while ((vh=0) and (gettickcount-lngs<5000)) do
begin
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
end;
//ShowMessage('suc shell');
end
else
begin
ShowMessage(IntToStr(VH));
end;
end;procedure TForm1.btn7Click(Sender: TObject);
begin
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
if vH > 0 then
begin
PostMessage(vH, SetPosition_Message, 20, 0);
end
else
begin
showmessage('VH=0');
end;
end;procedure TForm1.btn8Click(Sender: TObject);
begin
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
if vH > 0 then
begin
PostMessage(vH, StartBar_Message, 0, 0);
end;
end;procedure TForm1.btn9Click(Sender: TObject);
begin
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
if vH > 0 then
begin
PostMessage(vH, StopBar_Message, 0, 0);
end;
end;procedure TForm1.btn10Click(Sender: TObject);
begin
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
if vH > 0 then
begin
PostMessage(vH, UnloadBar_Message, 0, 0);
end;
end;procedure TForm1.btn11Click(Sender: TObject);
var
Data:tagCOPYDATASTRUCT;
pBuf:PChar;
strTip:string;
begin
strTip:='正在加载...';
//strTip:='zzfz...';
GetMem(pBuf, Length(strTip) + 1);
try
//ShowMessage(IntToStr(Length(strTip))); ZeroMemory(pBuf, Length(strTip) + 1);
StrPCopy(pBuf, strTip);
Data.cbData:= Length(strTip);
Data.dwData:= Length(strTip);
Data.lpData:= pBuf;
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
if vH > 0 then
begin
sendMessage(VH, WM_COPYDATA, Integer(self.Handle), Integer(@Data));
end
else
begin
showmessage('VH=0');
end;
finally
FreeMem(pBuf);
end;
end;procedure TForm1.btn12Click(Sender: TObject);
var
strtip:string;
begin
strtip:='正在加载...';
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
if vH > 0 then
begin
ShowMessage('begin sendmessage');
sendMessage(VH, SetTip_Message, Integer(self.Handle), Integer(pchar(strtip)));
end
else
begin
showmessage('VH=0');
end;
end;procedure TForm1.btn13Click(Sender: TObject);
var
strtip:string;
begin
strtip:='正在加载Clip...';
vH := findwindow('TfrmProgressbar', 'frmProgressbar');
if vH > 0 then
begin
Clipboard.AsText := strtip;
sendMessage(VH, SetTipClip_Message, Integer(self.Handle), 1);
end
else
begin
showmessage('VH=0');
end;
end;end.
微软有具体的说明
应对方法是每个线程要有自己的独立的connection,而不要与其它线程公用connection你可以做个测试
两个线程公用一个connection同时向某个数据表批量插入数据,结果过导致数据丢失
……If you create a single application that uses multiple threads to perform database operations, you must create one additional session for each thread.