我内部有一个线程和一个Progress Routine(一个函数)(在我的线程类中)。
我尝试在线程中执行此操作:
CopyFileEx(pchar(ListToCopy.Strings[Loop]),pchar(TN+ExtractFileName(ListToCopy.Strings[Loop])), @ProgressRoutine, nil, nil, 0);
但是我收到一个错误:“需要变量”(错误在于: @ProgressRoutine )。如果要在线程外部使用函数ProgressRoutine,那么一切都将正常。
如何在线程内使用该函数?
感谢。
答案 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;