gpt4 book ai didi

multithreading - 单独 TThread block GUI 线程中的操作

转载 作者:行者123 更新时间:2023-12-03 14:53:49 25 4
gpt4 key购买 nike

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

我遇到了问题,因为即使我已经在另一个线程中完成了下载(从 TThread 继承并在 Execute 方法中执行工作),GUI 线程似乎被阻止并且在下载完成之前不会处理消息。这是我的类(class)的代码: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 方法适用于我从类 TDownloadThreadUpdateDownloadProgress 方法内部手动调用 app.ProcessMessages 的情况。这可以防止 GUI 没有响应,但它会使进度条表现得很奇怪(aero 进度条的移动发光物体移动得太快),所以我将其删除。我想正确解决这个问题,如果我必须调用 ProcessMessages,那么多线程处理确实没有意义。

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

最佳答案

我现在已经为您提供了解决方案!

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

相反,您应该调用 ExecuteTarget(nil) ,它不会执行此类操作并按您的预期工作:下载在工作线程上运行。

关于multithreading - 单独 TThread block GUI 线程中的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5052549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com