Delphi: CopyFileEx и Thread

У меня есть поток и Progress Routine (функция) внутри него (в моем классе потока).

Я пытаюсь сделать это внутри потока:

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

Но я получаю ошибку: "Требуется переменная" (ошибка в следующем: @ProgressRoutine). Если сделать функцию ProgressRoutine вне потока, то все будет нормально.

Как использовать эту функцию внутри потока?

Благодарю.

1 ответ

Решение

Когда вы говорите "вне потока" и "внутри потока", вы подразумеваете "как отдельную функцию" и "как элемент объекта потока"? Потому что, если функция является членом объекта, ее сигнатура отличается, поэтому она не совпадает с ожидаемой компилятором.

Чтобы решить эту проблему, нужно пройти 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;
Другие вопросы по тегам