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

多线程 – 可以从辅助线程调用CopyFileEx吗?

发布时间:2020-12-14 05:25:00 所属栏目:Java 来源:网络整理
导读:从线程调用CopyFileEx和CopyCallback / ProgressRoutine函数(ProgressBar.Position将同步)是否可能? 我可以在线程中声明CopyCallback / ProgressRoutine函数吗?我在@ProgressRoutine上的CopyFileEx中收到错误:“需要变量”. 解决方法 当然有可能.回调函数
从线程调用CopyFileEx和CopyCallback / ProgressRoutine函数(ProgressBar.Position将同步)是否可能?

我可以在线程中声明CopyCallback / ProgressRoutine函数吗?我在@ProgressRoutine上的CopyFileEx中收到错误:“需要变量”.

解决方法

当然有可能.回调函数将在调用CopyFileEx的线程的上下文中调用.如果您需要同步一些UI命令,请使用Delphi通常的TThread.Synchronize,或者您想要的任何其他线程间同步技术.

回调函数不能是线程类的方法.它需要匹配API指定的签名,因此它需要是一个独立的功能.当您正确声明它时,将它传递给CopyFileEx时不需要使用@运算符.

function CopyProgressRoutine(TotalFileSize,TotalBytesTransferred: Int64;
  StreamSize,StreamBytesTransferred: Int64;
  dwStreamNumber,dwCallbackReason: DWord;
  hSourceFile,hDestinationFile: THandle;
  lpData: Pointer): DWord; stdcall;

您可以使用lpData参数为回调函数提供对关联线程对象的访问权限.调用CopyFileEx时,传递对该参数的线程对象的引用:

procedure TCopyThread.Execute;
begin
  ...
  CopyResult := CopyFileEx(CurrentName,NewName,CopyProgressRoutine,Self,@Cancel,CopyFlags);
  ...
end;

通过访问线程对象,您可以调用该对象上的方法,包括它自己的进度例程,因此以下内容可以构成整个独立函数.它可以将其他所有内容委托给您的对象的方法.这里我假设该方法具有与独立函数相同的所有参数,除了它省略了lpData参数,因为它将作为Self参数隐式传递.

function CopyProgressRoutine;
var
  CopyThread: TCopyThread;
begin
  CopyThread := lpData;
  Result := CopyThread.ProgressRoutine(TotalSize,TotalBytesTransferred,StreamSize,StreamBytesTransferred,dwStreamNumber,dwCallbackReason,hSourceFile,hDestinationFile);
end;

(编辑:李大同)

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

    推荐文章
      热点阅读