2011-08-09 14 views
8

Tengo un subproceso y una rutina de progreso (una función) dentro de él (en mi clase de subproceso).Delphi: CopyFileEx y subproceso

que trato de hacer esto dentro de la rosca:

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

pero me da un error: "variable requerida" (el error está en esto: @ProgressRoutine). Si para hacer la función ProgressRoutine fuera del hilo, entonces todo será normal.

¿Cómo usar esa función dentro del hilo?

Gracias.

Respuesta

9

Cuando dice "fuera del hilo" y "dentro del hilo", ¿quiere decir "como una función independiente" y "como miembro del objeto de hilo"? Porque si una función es miembro de un objeto, su firma es diferente, por lo que no coincide con lo que el compilador espera.

La forma en que puede resolver esto es pasar Self a CopyFileEx como el parámetro lpData. Esto le da un puntero que pasará a la devolución de llamada. Escriba su devolución de llamada como una función independiente que interpreta el parámetro lpData como una referencia de objeto de subproceso y lo utiliza para llamar al método en su objeto de subproceso con los mismos parámetros.

EDITAR: Ejemplo simple. Digamos que la devolución de llamada solo tiene dos parámetros, llamados "valor" y "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

gracias !!! ¿Podrías escribir 2 cadenas de código por favor? Lamentablemente, no entendí exactamente qué hacer. – maxfax

+0

@Maxfax: Allí, lo actualicé con un ejemplo simplificado. Debería poder extrapolar la devolución de llamada real desde allí. –

+0

grandes gracias !!!!!!! – maxfax