当您说“线程外”和“线程内”时,您的意思是“作为独立函数”和“作为线程对象的成员”吗?因为如果一个函数是一个对象的成员,它的签名是不同的,所以它与编译器所期望的不匹配。
您可以解决此问题的方法是作为参数传递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;