1

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

查询打开时线程挂起。

4

2 回答 2

2

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

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

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

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

问题是我不认为你有一个循环,你正在使用一个组件,如果该组件没有调用方法来显示进度,你就无法估计查询需要多长时间才能完成。因此,您要么在没有进度条的情况下执行查询时显示加载...屏幕,要么告诉我们更多关于您用于查询的内容。

希望能帮助到你

于 2012-12-17T12:42:13.137 回答
1

你反其道而行之。

UI 绑定到应用程序主线程,因此您始终在主线程中处理 UI,并在工作线程中完成真正的工作(从那里获得工作人员名称)。

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

至于30 秒的等待时间,真的,如果你不能准确地确定加载时间,最好不要使用进度条,因为我们都讨厌那些不能反映事物真实状态的骗子条。您的条形图有时会显示 50%,然后突然变为 100%……或者它可能达到 100%,而实际上真正的事情需要很长时间才能完成(服务器负载过重、网络速度慢和 1,000 个其他因素) .

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

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

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

于 2012-12-18T16:37:53.727 回答