2011-08-09 14 views
8

İçinde bir iş parçacığım ve bir İlerleme Düzenlemesi (bir işlev) var (iş parçacığımda).Delphi: CopyFileEx ve Konu

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

Ama bir hata alıyorum:

Ben parçacığı içinde bu yapmaya çalışacağım "Değişken gerekli" (hata Bunun içinde: @ProgressRoutine). ProgressRoutine iş parçacığı dışında işlev yapmak için, hepsi normal olacaktır.

Bu işlev iş parçacığı içinde nasıl kullanılır?

Teşekkürler.

cevap

9

"İş parçacığının dışında" ve "iş parçacığının içinde" derken, "bağımsız işlev olarak" ve "iş parçacığının bir üyesi olarak" kastediyor musunuz? Çünkü bir işlev bir nesnenin üyesiyse, imzası farklıdır, bu nedenle derleyicinin beklediğiyle eşleşmez.

Bu sorunu çözebilmenin yolu SelfCopyFileEx parametresini lpData parametresi olarak geçirmektir. Bu, geri çağrıya geri döneceğini gösteren bir işaretçi verir. Geri bildirimi, lpData parametresini thread nesne referansı olarak yorumlayan bağımsız bir işlev olarak yazın ve thread nesnesindeki yöntemi aynı parametrelerle çağırmak için bunu kullanır.

DÜZENLEME: Basit örnek. geri arama yalnızca iki parametre, sözde "değer" ve "lpData" olduğunu varsayalım:

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

teşekkürler !!! Bir kodun 2 dizesini yazar mısınız lütfen? Ne yazık ki, ne yapacağımı tam olarak anlamadım. – maxfax

+0

@Maxfax: Burada basitleştirilmiş bir örnekle güncelledim. Gerçek geri bildirimi oradan tahmin edebileceksiniz. –

+0

büyük teşekkürler !!!!!!! – maxfax