我有一个需要加载到内存中的大型查询。此查询大约需要30秒才能打开。它在应用程序启动后立即加载,仅加载一次。在此期间,应用程序挂起。我需要做的是在30秒内更新进度条。我试图创建一个新的线程来更新进度条,但它只会在打开查询后更新。任何人都可以用一种简单的方法来做到这一点吗?
我创建了一个线程类:
type
TMyThread = class(TThread)
private
fLowerLimit: Integer;
fUpperLimit: Integer;
我正在创建一个线程类的实例:
CountingThread := TMyThread.Create(0, 300, True);
CountingThread.Resume;
//
SplashDlg.Show;
在线程中我只是更新进度条:
procedure TMyThread.UpdateMainThread;
begin
SplashDlg.ProgressBar1.Position:= SplashDlg.ProgressBar1.Position+1;
MyDebug('UpdateMainThread:'+ IntToStr(SplashDlg.ProgressBar1.Position));
end;
线程在查询打开时挂起。
答案 0 :(得分:2)
如果您希望获得更准确的答案,最好在此处粘贴一些代码。
有两种方法可以处理数据并让UI响应。
您可以在循环中使用Application.ProcessMessages。
或者您已经接洽的线程解决方案。
问题是我认为您没有使用组件的循环,如果该组件没有调用方法来显示进度,则无法估计查询完成所需的时间。因此,您可以在没有进度条的情况下显示加载...屏幕,也可以告诉我们有关您用于查询的内容的更多信息。
希望有所帮助
答案 1 :(得分:1)
你正在做相反的事情。
UI绑定到应用程序主线程,因此您始终处理主线程中的UI ,并在工作线程中执行实际工作(从那里工作者名称)。
你提出这个问题的方式,你已经在处理线程了,所以,只需改变你的观点并在辅助线程中执行繁重的SQL加载,同时保持你的UI响应和更新,现在非 - 主线程。
至于 30秒等待时间,实际上,如果你不能确定加载时间最好不要使用进度条,因为我们都讨厌骗子没有反映真实状况的酒吧。您的酒吧有时会显示50%并突然变为100%......或者它可能会达到100%,而事实上真实需要花费很长时间才能完成(服务器负载很重,网络速度慢,还有其他1,000个因素)
如今,我们都习惯了等待指标,如下所示:
当你看到这个时,你知道它正在发挥作用,你只需要等到它完成。