Delphi: CopyFileEx и Thread - PullRequest
       18

Delphi: CopyFileEx и Thread

8 голосов
/ 09 августа 2011

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

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

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

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

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

Спасибо.

1 Ответ

9 голосов
/ 09 августа 2011

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

Способ, который вы можете решить, это передать 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;
...