加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:56:08 所属栏目:Java 来源:网络整理
导读:我使用本教程 http://delphi.about.com/od/kbthread/a/thread-gui.htm创建了一个类,该类使用TDownLoadURL在另一个线程中从Internet异步下载文件.我这样做是因为我想在不阻止UI线程的情况下下载文件,因此程序在大型下载期间不会无响应,进度条可以更新等. 我遇
我使用本教程 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方法适用于我从类TDownloadThread的UpdateDownloadProgress方法中手动调用app.ProcessMessages的时间.这会使GUI无法响应,但它使得进度条表现得很糟糕(aero的进度条的移动发光太快了),所以我删除了它.我想正确地解决这个问题,如果我必须调用ProcessMessages,那么多线程就没有意义.

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

解决方法

我现在有了解决方案!

调用TDownLoadURL.Execute(您在TDownloadThread中调用dl.Execute)会导致操作被转移回主线程,这就是您的UI变得无法响应的原因.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读