2011-08-09 4 views
8

내 스레드 클래스의 스레드와 진행 루틴 (함수)이 있습니다.델파이 : CopyFileEx 및 스레드

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

하지만 오류 얻을 :

나는 스레드 내에서이 작업을 수행하려고 "변수 필요"(오류이에 있습니다 @ProgressRoutine을). 스레드 외부에서 ProgressRoutine 함수를 작성하면 모든 것이 정상입니다.

스레드 내에서 해당 함수를 사용하는 방법은 무엇입니까?

감사합니다.

답변

9

"스레드 외부"및 "스레드 내부"라고 말하면 "독립 실행 형 함수"및 "스레드 객체의 멤버"를 의미합니까? 함수가 객체의 멤버 인 경우 해당 서명이 다르므로 컴파일러에서 기대하는 것과 일치하지 않습니다.

이 문제를 해결할 수있는 방법은 SelfCopyFileExlpData 매개 변수로 전달하는 것입니다. 이것은 콜백에 다시 전달할 포인터를 준다. 8. 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; 
+0

감사합니다. 코드 2 줄을 써 주시겠습니까? 불행히도, 나는 무엇을 해야할지 정확히 이해하지 못했습니다. – maxfax

+0

@Maxfax : 간단한 예제로 업데이트했습니다. 거기에서 실제 콜백을 외삽 할 수 있어야합니다. –

+0

큰 감사 !!!!!!! – maxfax