没有新线程打开大型查询

时间:2012-12-17 12:32:48

标签: multithreading delphi delphi-xe

我有一个需要加载到内存中的大型查询。此查询大约需要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;

线程在查询打开时挂起。

2 个答案:

答案 0 :(得分:2)

如果您希望获得更准确的答案,最好在此处粘贴一些代码。

有两种方法可以处理数据并让UI响应。

  • 您可以在循环中使用Application.ProcessMessages。

  • 或者您已经接洽的线程解决方案。

问题是我认为您没有使用组件的循环,如果该组件没有调用方法来显示进度,则无法估计查询完成所需的时间。因此,您可以在没有进度条的情况下显示加载...屏幕,也可以告诉我们有关您用于查询的内容的更多信息。

希望有所帮助

答案 1 :(得分:1)

你正在做相反的事情。

UI绑定到应用程序主线程,因此您始终处理主线程中的UI ,并在工作线程中执行实际工作(从那里工作者名称)。

你提出这个问题的方式,你已经在处理线程了,所以,只需改变你的观点并在辅助线程中执行繁重的SQL加载,同时保持你的UI响应和更新,现在非 - 主线程。

至于 30秒等待时间,实际上,如果你不能确定加载时间最好不要使用进度条,因为我们都讨厌骗子

如今,我们都习惯了等待指标,如下所示:

enter image description here

enter image description here

enter image description here

当你看到这个时,你知道它正在发挥作用,你只需要等到它完成。