2010-11-17 8 views
8

en Delphi XE puedo usar el procedimiento de arranque, pero este método no existe en Delphi 2007. código¿Cuál es la forma correcta de iniciar un hilo suspendido en delphi 2007?

este ejemplo funciona bien en xe delphi, mediante Inicio

MyThread:=TMyThread.Create(True); 
MyThread.FreeOnTerminate :=True; 
MyThread.Property1:=900; 
MyThread.Property2:=2; 
MyThread.Start; 

pero en Delphi 2007, el start El procedimiento no existe, entonces estoy usando el procedimiento de reanudación que está en desuso en las nuevas versiones de Delphi.

MyThread:=TMyThread.Create(True); 
MyThread.FreeOnTerminate :=True; 
MyThread.Property1:=900; 
MyThread.Property2:=2; 
MyThread.Resume; 

por lo que el quieon Es decir, es el uso aceptable resume en Delphi 2007 o I deben usar otro método para comenzar un hilo suspendido?

Gracias de antemano.

Respuesta

19

La forma correcta de iniciar un hilo suspendido es nunca tener un hilo suspendido en el primer lugar.

Hay una mejor manera de crear subprocesos. Si la persona que llama debe proporcionar un valor al objeto para que la clase funcione correctamente, entonces no lo haga opcional: Requerirlo como un parámetro para el constructor. Y si solo hay un valor válido para ese parámetro, entonces ni siquiera lo conviertes en un parámetro: simplemente codifícalo en el constructor. (? ¿Cuántas veces ha escrito una clase de hilo que sólo veces debe liberarse a la terminación nunca he visto eso.)

constructor TMyThread.Create(Prop1, Prop2: Integer); 
begin 
    inherited Create(False); 
    FreeOnTerminate := True; 
    Property1 := Prop1; 
    Property2 := Prop2; 
end; 

continuación, puede utilizar el método Ron Popeil de crear hilos: Justo ¡configúralo y olvídalo!

MyThread := TMyThread.Create(900, 2); 

La persona que llama no tiene que ver nada con el hilo después de crearlo. Y dado que es un hilo de terminación libre, es posible que la persona que llama ni siquiera deba mantener una referencia a la variable MyThread, ya que la referencia dejará de ser válida tan pronto como el hilo termine de ejecutarse.

(preocupado por eso inherited Create(False) línea de crear un hilo que va a empezar a correr antes que el resto del constructor termina de ejecutarse? No sea! Eso se fijó en Delphi 6, hace más de una década. El hilo se iniciará automáticamente después de que el constructor termine, vea TThread.AfterConstruction para ver cómo.)

+1

+ Inf para el último párrafo – arthurprs

+0

Gracias por la información agregada sobre el orden de creación y ejecución. Siempre he comenzado a suspender los hilos y los reanudé con este miedo exacto. –

1

Sí, esa es la forma correcta para versiones anteriores de Delphi que no tienen un procedimiento Start.

1

Reanudar y suspender están en desuso en Delphi 2010 y en versiones más recientes. Parece que es básicamente para desalentar el uso de ellos para la sincronización de hilos. Ellos no son para eso.

De todos modos, si todo lo que quiere hacer es reanudar un hilo creado suspendido, entonces llamar a Reanudar en versiones anteriores es seguro.

Si necesita utilizar el mismo código fuente tanto en Delphi 2007 como en Delphi XE, puede usar la compilación condicional para evitar advertencias en XE.

También, echar un vistazo a esta pregunta que está relacionada con su pregunta:

TThread.resume is deprecated in Delphi-2010 what should be used in place?

0

Nunca debe llamar a suspender en un tthread, no es seguro hacerlo y solo se debe reanudar para iniciar un hilo que se ha creado suspendido.

En Delphi 2010 se suspendieron y reanudaron donde se depreciaron y se introdujo el método para reforzar esto.

Para una explicación más completa, consulte este thread en los foros de Codegears.

5

No hay nada de malo en llamar al currículum en una secuencia que se creó con el parámetro CreateSuspended establecido en true en el constructor. (¿Por qué si no habría un parámetro CreateSuspended después de todo?)

Sin embargo, el problema real aparece cuando suspende/reanuda un hilo que se ejecuta. Principalmente esto se debe a referencias a recursos abiertos, como objetos COM. (Por ejemplo, si tiene un objeto de conexión ADO activo y una consulta en ejecución ... no es muy ideal suspender ese hilo e intentar reanudarlo más tarde ... obviamente, no siempre va a funcionar bien para usted o la conexión de la base de datos en ese escenario.)

Si tiene cuidado con sus referencias externas, entonces suspender/reanudar un hilo en ejecución se vuelve mucho más seguro, excepto por las posibles condiciones de carrera que pueden surgir ... pero esas son respuestas para muchas otras preguntas ...

+0

O en general, cualquier instancia cuando envía algún tipo de solicitud y está esperando algún tipo de respuesta. –

Cuestiones relacionadas