一个 老问题 大量数据查询,进度条的问题(100)

  • 主题发起人 主题发起人 令狐小侠
  • 开始时间 开始时间

令狐小侠

Unregistered / Unconfirmed
GUEST, unregistred user!
1.由于数据量较大,所以查询的时候 想搞一个 假的进度条2.用多线程来处理,发现行不通,差资料 很多 人都这么干的,不知道我的程序问题出在那里type TThreadBar = class; TFrmProcessBar = class(TForm) BitBtn1: TBitBtn; bar: TProgressBar; procedure BitBtn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; TThreadBar = Class(TThread) protected FrmProcessBar: TFrmProcessBar; procedure Show; procedure Barprocess; procedure Execute;override; public Constructor Create; Destructor Destroy;override; end;var ThreadBar : TThreadBar; procedure ShowBar; procedure HideBar;implementation{$R *.dfm}procedure ShowBar;begin ThreadBar := TThreadBar.Create; ThreadBar.Resume;// if (FrmProcessBar=nil) then// TFrmProcessBar;// application.CreateForm(TFrmProcessBar,FrmProcessBar);// FrmProcessBar.Show;// frmprocessbar.Invalidate;end;procedure HideBar;begin threadbar.Terminate;end;{ TThreadBar }procedure TThreadBar.Barprocess;begin FrmProcessBar.bar.Position := FrmProcessBar.bar.Position + 5; if FrmProcessBar.bar.Position>=100 then FrmProcessBar.bar.Position :=0;end;constructor TThreadBar.Create;begin inherited create(true); self.FreeOnTerminate := true; FrmProcessBar:= TFrmProcessBar.Create(nil); FrmProcessBar.Show;end;destructor TThreadBar.Destroy;begin inherited;end;procedure TThreadBar.Execute;begin while not self.Terminated do begin self.Synchronize(Barprocess); sleep(1000); end; //self.FrmProcessBar.Free;end;procedure TFrmProcessBar.BitBtn1Click(Sender: TObject);begin hideBar;end;procedure TThreadBar.Show;begin frmProcessBar.Show;end;procedure TFrmProcessBar.FormCreate(Sender: TObject);begin // ThreadBar := TThreadBar.create;end;procedure TFrmProcessBar.FormClose(Sender: TObject; var Action: TCloseAction);begin { ThreadBar.Terminate; action := cafree; FrmprocessBar := nil; }end;procedure TFrmProcessBar.FormShow(Sender: TObject);begin // ThreadBar.Resume; // self.Invalidate;end;end.
 
拷贝你代码测试了,可以产生一个界面,上面进度条不断地跑,跑到100又从0开始。你遇到什么问题了?
 
啊..to:znxia 我的 机器上面 能出窗口,...但 进度条 不动...都想了一天了 也没想明白....你调用showbar 后 sleep(10000000)//代表调数据库 阻塞
 
self.Synchronize(Barprocess);中调用了WaitForSingleObject(SyncProc.Signal, INFINITE);当主程序阻塞的时候,waitforsingleobject就一直等待。帮你顶。
 
假的进度条么,弄一个动画好了,干嘛非得用progressbar啊
 
destructor TThreadBar.Destroy;begin FrmProcessBar.free; FrmProcessBar:=nil; inherited;end;procedure TThreadBar.Execute;begin while (not self.Terminated) and(FrmProcessBar<>nil) do begin// self.Synchronize(Barprocess); Barprocess; //按理说应该通过Synchronize调用,可这样居然也可以运行 sleep(100); end; //self.FrmProcessBar.Free;end;
 
当然可以, 同步只是为了多个动作可能在同一时间修改某个地方时才有用. 但是如果只有一个动作去修改的话不同步也是可以的``
 
这个好像是可以实现的 计算sql运行花费的事件,然后不就好处理了吗?
 
to znxia:如果主线程阻塞的,Synchronize(Barprocess) 方法 一直等待的话..那 这样我这个 假 进度条 就实现不了了啊....那应该 怎么办啊..在网上 看好多人 都 用这个 破办法....不知道 他们 是怎么解决的
 
destructor TThreadBar.Destroy;begin FrmProcessBar.free; FrmProcessBar:=nil; inherited;end;procedure TThreadBar.Execute;begin while (not self.Terminated) and(FrmProcessBar<>nil) do begin Barprocess; sleep(100); end;end;
 
我说点看法,进度条是显示进度用的,如果你不能显示进度就不要用进度条。直接用个动画表示正在查询就完了。如果你非要用进度条,那只能分批查,每取一次数据,进度条走一格。。。但是这样整,有个数据合并的问题。。 好像用ClientDataset可以分批下载。。只提供一个思路
 
试试看....
 
你在查询的时候整个进程几乎都死了,无论你如何采用现成也不行啊!我一直用的方法,用另外一个进程加入通讯假进度显示即可!
 
多谢各位 参与讨论..现在我用了另外一个方法1.查询数据不在主线程中执行2.查询完毕 给 主线程 发消息..目前就是要注意 线程同步...
 
如果是用 ADO 的话, 可以用 异步 查询, 来修改进度~
 
to liuls 是否可以说具体一点呢?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
576
import
I
S
回复
0
查看
763
SUNSTONE的Delphi笔记
S
后退
顶部