小编Kok*_*tsu的帖子

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

我使用本教程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.ProcessMessagesUpdateDownloadProgress类的方法中手动调用的时间TDownloadThread.这会使GUI无法响应,但它使得进度条表现得很糟糕(aero的进度条的移动发光的东西移动方式太快),所以我删除了它.我想正确地解决这个问题,如果我必须打电话ProcessMessages那么多线程就没有意义.

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

delphi user-interface multithreading block delphi-2010

7
推荐指数
1
解决办法
1158
查看次数

将参数传递给CreateThread

我在调用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如何工作的基本误解,所以有人可以告诉我如何使其正常工作吗?

delphi parameter-passing delphi-2010 createthread

3
推荐指数
2
解决办法
6825
查看次数

ForceDirectories返回False

我正在使用这样的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功能失效.有谁知道它为什么会这样?(我在看着你大卫)

delphi directory delphi-2010

3
推荐指数
2
解决办法
1565
查看次数