Delphi:CopyFileEx和Thread

时间:2011-08-09 00:02:14

标签: multithreading delphi file-copying

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

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

CopyFileEx(pchar(ListToCopy.Strings[Loop]),pchar(TN+ExtractFileName(ListToCopy.Strings[Loop])), @ProgressRoutine, nil, nil, 0);

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

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

感谢。

1 个答案:

答案 0 :(得分:9)

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

解决此问题的方法是将Self作为CopyFileEx参数传递给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;