9

我在其中(在我的线程类中)有一个线程和一个进度例程(一个函数)。

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

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

但我收到一个错误:“需要变量”(错误在此:@ProgressRoutine)。如果把ProgressRoutine这个函数放到线程外就一切正常了。

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

谢谢。

4

1 回答 1

10

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

您可以解决此问题的方法是作为参数传递Self给。这给了它一个指针,它将传递回回调。将您的回调编写为一个独立函数,该函数将参数解释为线程对象引用,并使用它来调用具有相同参数的线程对象上的方法。CopyFileExlpDatalpData

编辑:简单的例子。假设回调只有两个参数,分别称为“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;
于 2011-08-09T00:19:04.723 回答