在单独的TThread块GUI线程中的操作

时间:2011-02-19 18:05:27

标签: multithreading delphi user-interface delphi-2010 block

我使用本教程http://delphi.about.com/od/kbthread/a/thread-gui.htm创建了一个类,该类在另一个具有TDownLoadURL的线程中从Internet异步下载文件。我之所以这样做,是因为我想在不阻止UI线程的情况下下载文件,因此程序在大型下载期间不会无响应,进度条可以更新等等。

我遇到了问题,因为即使我已经在另一个线程中完成了下载(继承自TThread并在Execute方法中执行工作),GUI线程似乎被阻止,并且在下载完成之前不会处理消息。这是我班级的代码:http://codepad.org/nArfOPJK(它只有99行,一个简单的类)。我正在执行它,在按钮单击的事件处理程序中执行:

var
    frame: TTProgressFrame;
    dlt: TDownloadThread;
begin
    dlt := TDownloadThread.Create(True);
    dlt.SetFile('C:\ohayo.zip');
    dlt.SetURL('http://download.thinkbroadband.com/512MB.zip');
    dlt.SetFrame(frame);
    dlt.SetApp(Application);
    dlt.Start;

注意:SetApp方法适用于我在班级app.ProcessMessages的{​​{1}}方法中手动调用UpdateDownloadProgress的时间。这会使GUI无法响应,但它使得进度条表现得很糟糕(aero的进度条的移动发光的东西移动方式太快),所以我删除了它。我想正确地解决这个问题,如果我必须调用TDownloadThread那么多线程就没有意义。

有人可以帮我解决这个问题吗?感谢。

1 个答案:

答案 0 :(得分:5)

我现在有了解决方案!

拨打TDownLoadURL.Execute(您对dl.ExecuteTDownloadThread的来电)会导致操作被转回主线程,这就是您的用户界面无响应的原因。

相反,你应该调用ExecuteTarget(nil)执行没有这样的阴谋并且按照你的意图工作:下载在工作线程上运行。