我使用本教程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那么多线程就没有意义.
有人可以帮我解决这个问题吗?谢谢.
我在调用CreateThread时将类引用作为参数传递给ThreadProc时遇到问题.这是一个演示我遇到的问题的示例程序:
program test;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows, Dialogs;
type
TBlah = class
public
fe: Integer;
end;
function ThreadProc(param: Pointer) : DWORD;
begin
ShowMessage(IntToStr(TBlah(param).fe));
Result := 0;
end;
var
tID: DWORD;
handle: THandle;
b: TBlah;
begin
b := TBlah.Create;
b.fe := 54;
handle := CreateThread(nil, 0, @ThreadProc, Pointer(b), 0, tID);
WaitForSingleObject(handle, INFINITE);
end.
Run Code Online (Sandbox Code Playgroud)
调用ShowMessage弹出一个消息框,里面有类似的东西245729105,54不像我期望的那样.
这可能只是对Delphi如何工作的基本误解,所以有人可以告诉我如何使其正常工作吗?
我正在使用这样的ForceDirectories功能:
ForceDirectories('C:/Path/To/Dir');
Run Code Online (Sandbox Code Playgroud)
它返回False并且根本没有创建目录.GetLastError返回0.我正在运行具有管理权限的程序.
如果我做
ForceDirectories('C:/Path');
ForceDirectories('C:/Path/To');
ForceDirectories('C:/Path/To/Dir');
Run Code Online (Sandbox Code Playgroud)
每次调用都成功,并创建目录.但是,这会使ForceDirectories功能失效.有谁知道它为什么会这样?(我在看着你大卫)