Delphi: CopyFileEx 和线程

9

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

我尝试在线程内部执行以下操作:

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

但我收到一个错误:“需要变量”(错误出现在这里:@ProgressRoutine)。如果将函数 ProgressRoutine 放在线程外面,那么一切都会正常。

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

谢谢。

1个回答

10
当你说“线程外部”和“线程内部”时,你是指“作为独立的函数”和“作为线程对象的成员”吗?因为如果一个函数是对象的成员,它的签名就不同,所以它与编译器期望的不匹配。
你可以通过将Self作为lpData参数传递给CopyFileEx函数来解决这个问题。这会给它一个指针,它将把它传回给回调函数。编写一个独立的函数作为回调函数,将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;

谢谢!你能写两行代码吗?很遗憾,我不太明白该怎么做。 - maxfax
@Maxfax:我已经更新了一个简化的例子,你应该能够从中推断出实际的回调函数。 - Mason Wheeler
作为回调函数传递给Windows API函数的非stdcall函数? - Marco van de Voort
@Marco:就像我说的一样,这只是一个简化的例子。 - Mason Wheeler
添加了stdcall声明。简化了<>错误。 - Warren P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接