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;