Delphi:CopyFileEx和Thread

max*_*fax 8 delphi multithreading file-copying

我内部有一个线程和一个Progress Routine(一个函数)(在我的线程类中).

我尝试在线程内执行此操作:

CopyFileEx(pchar(ListToCopy.Strings[Loop]),pchar(TN+ExtractFileName(ListToCopy.Strings[Loop])), @ProgressRoutine, nil, nil, 0);
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:"需要变量"(错误在于:@ProgressRoutine).如果要在线程外部使函数ProgressRoutine,那么一切都将正常.

如何在线程内使用该函数?

谢谢.

Mas*_*ler 9

当你说"线程之外"和"线程内部"时,你的意思是"作为一个独立的函数"和"作为线程对象的成员"?因为如果函数是对象的成员,则其签名是不同的,因此它与编译器期望的不匹配.

你能解决这个问题的方法是通过SelfCopyFileEx作为lpData参数.这给它一个指针,它将传递回回调.将您的回调编写为独立函数,将该lpData参数解释为线程对象引用,并使用该函数以相同的参数调用线程对象上的方法.

编辑:简单的例子.假设回调只有两个参数,称为"value"和"lpData":

procedure ProgressRoutine(value: integer; lpData: pointer); stdcall;
var
  thread: TMyThreadClass;
begin
  thread := lpData;
  thread.ProgressRoutine(value);
end;

procedure TMyThreadClass.ProgressRoutine(value: integer);
begin
  //do something with the value here
end;

procedure TMyThreadClass.Execute;
begin
  CopyFileEx(pchar(ListToCopy.Strings[Loop]),pchar(TN+ExtractFileName(ListToCopy.Strings[Loop])), @ProgressRoutine, Self, nil, 0);
  //passing Self to lpData; it will get passed back to the callback
end;
Run Code Online (Sandbox Code Playgroud)