Kok*_*tsu 7 delphi user-interface multithreading block delphi-2010
我使用本教程http://delphi.about.com/od/kbthread/a/thread-gui.htm来创建一个类,该类在另一个线程中使用a异步下载来自Internet的文件TDownLoadURL.我这样做是因为我想在不阻止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;
Run Code Online (Sandbox Code Playgroud)
注意:SetApp方法适用于我app.ProcessMessages从UpdateDownloadProgress类的方法中手动调用的时间TDownloadThread.这会使GUI无法响应,但它使得进度条表现得很糟糕(aero的进度条的移动发光的东西移动方式太快),所以我删除了它.我想正确地解决这个问题,如果我必须打电话ProcessMessages那么多线程就没有意义.
有人可以帮我解决这个问题吗?谢谢.
我现在有了解决方案!
调用TDownLoadURL.Execute(你要调用dl.Execute的TDownloadThread在动作的结果)传送回主线程这就是为什么你的UI变得反应迟钝.
相反,你应该调用ExecuteTarget(nil)哪个不执行这样的阴谋并按预期工作:下载在工作线程上运行.