2009-09-13 12 views
33

En mi aplicación multihiloTThread.resume está en desuso en Delphi-2010 ¿qué se debe usar en su lugar?

utilizo TThread.suspend y TThread.resume

Desde que se trasladó a mi solicitud de Delphi 2010 me sale el siguiente mensaje en guerra

[DCC Aviso] xxx .pas (277): W1000 Símbolo 'Currículum' está en desuso

Si el currículum está en desuso, ¿qué se debe usar en su lugar?

EDIT 1:

que utilice el comando Reanudar para iniciar el hilo - ya que se crea con 'CreateSuspended' establece en true y Suspender antes de terminar el hilo.

EDIT 2:

Here is a link the delphi 2010 manual

Respuesta

25

Charles si lees el código de la clase TThread, encuentras la respuesta.

TThread = class 
    private type 

.. 
.. 
.. 
    public 
    constructor Create(CreateSuspended: Boolean); 
    destructor Destroy; override; 
    procedure AfterConstruction; override; 
    // This function is not intended to be used for thread synchronization. 
    procedure Resume; deprecated; 
    // Use Start after creating a suspended thread. 
    procedure Start; 
    // This function is not intended to be used for thread synchronization. 
    procedure Suspend; deprecated; 
    procedure Terminate; 

ver este enlace http://wings-of-wind.com/2009/08/28/rad-studio-2010-community-pulse-the-day-after-part-2/

Editar:

Si necesita sincronizar las discusiones, se puede utilizar un esquema basado en TMutex, TEvent y secciones críticas.

Adiós.

+11

Esto es genial, excepto Me gustaría saber qué código necesitamos escribir realmente? El enlace –

+1

no funciona. Ahora su contenido está en http://windwingsw.wordpress.com/2009/08/28/rad-studio-2010-community-pulse -the-day-after-part-2/ –

+0

No todo el mundo tiene acceso al código RTL dentro de su instalación de Delphi. –

11

Uso TThread.Start en lugar de .Resume

--EDIT-- Start puede único curso de utilizar con Delphi 2010 (y más tarde, presumiblemente) para iniciar un hilo que se creó suspendido (donde antes habría utilizado el currículum).

No se recomienda el uso de reanudar/suspender (o las funciones correspondientes de WinAPI) para la sincronización de hilos. Consulte la discusión here (eche un vistazo a los comentarios de Barry Kelly).

+3

una respuesta, en realidad - Suspender el uso de '()' y 'Reanudar()' para "sincronización" ya no se utiliza sin ningún reemplazo. Los objetos de sincronización apropiados han estado disponibles desde la época de Delphi 2. Y ya es hora de que estos métodos mal concebidos hayan quedado obsoletos. – mghie

+1

@mghie - De acuerdo, suspender/reanudar no se debe utilizar para la sincronización, pero la sincronización no se menciona en ninguna parte en la pregunta. Y el nuevo "Inicio" puede reemplazar el antiguo "Currículum", al menos en algunos casos (consulte el código TThread publicado por RRUZ). – PhiS

+0

Estoy de acuerdo en cuanto a 'Resume()'. Sin embargo, con 'Suspender()' solo hay IMO en esta explicación, incluso cuando no se detalla en la pregunta. – mghie

4

El código de control de comportamiento del hilo debe estar en un procedimiento de rosca. Use los objetos de sincronización apropiados y las llamadas API correspondientes para suspender/reanudar la ejecución de la secuencia. Hacerlo desde afuera es una práctica peligrosa. Entonces hubo una decisión de privarlo.

+3

De acuerdo. Esto tiene sentido, en la medida de lo posible, sin embargo escribirlo usted mismo El tiempo es como tener que soldar algo en su automóvil cada vez que quiere aparcarlo en paralelo. Un servicio básico como "un hilo de trabajo que se puede pausar" debería al menos ser parte de un TWorkerThread, si no en la base TThread. –

5

Suspender y Resume eran (o solía ser) potencialmente roto en el clase TThread (si nos fijamos en la fuente se verá que el método de suspensión directa e incondicionalmente establece un booleano para hilo indicada suspendido en lugar de derivar de forma más robusta este estado del recuento de ejecución en el identificador de subprocesos. Irónicamente, el método Reanudar utiliza este indicador más robusto para actualizar el estado suspendido Booleano).

Posiblemente esta es la razón por la que han sido depreciadas. También es la razón por la que implementé mi propia clase para encapsular un hilo de Windows con un mecanismo de suspensión y reanudación más robusto, así como la capacidad de reiniciar un hilo una vez que se haya completado.

No estoy seguro de por qué su desaprobación supuestamente está relacionada con la sincronización. La suspensión y reanudación de subprocesos no está necesariamente relacionada con la sincronización, aunque puedo ver cómo podría ser. Es interesante observar que los métodos equivalentes en la clase Thread de .NET Framework están marcados de manera similar como obsoletos. Y los mismos comentarios w.r.t sincronización aparecen en la documentación API de Windows para suspender/reanudar hilo.

Si usar métodos en desuso te pone nervioso y aún deseas suspender/reanudar siempre puedes usar la API de Windows a suspend and resume the thread by reference to it's handle.

+0

¿Podría agregar algo de información para qué 'Suspender()' y 'Reanudar()' deberían utilizarse en su opinión, si "suspender y reanudar los hilos no está necesariamente relacionado con la sincronización"? También me pregunto por qué un hilo debería * reiniciarse *. – mghie

+3

Ha habido alguna discusión sobre Suspender/Reanudar aquí: http://forums.codegear.com/message.jspa?messageID=3466 Especialmente eche un vistazo a los comentarios de Barry Kelly. La conclusión es que no debe tocar Suspender ni las funciones SuspendThread de WinAPI, y el resumen debe usarse esencialmente solo para iniciar un hilo que se ha creado suspendido. Suspend/Resume no debe usarse para la sincronización de hilos. – PhiS

+0

De acuerdo con Allen Bauer, estas funciones están destinadas para su uso en depuradores que necesitan controlar el estado del hilo. –

2

Debe crear el hilo de la siguiente manera:

constructor TSignalThread.Create; 
begin 
// create event handle first! 
    FEventHandle := CreateEvent(
      {security}  nil, 
      {bManualReset} true, 
      {bInitialState} false, 
      {name}   nil); 
    FWaitTime := 10; 
    inherited Create({CreateSuspended}false); 
end; 

De esta manera la llamada no es necesario para iniciar.

Consulte http://www.gerixsoft.com/blog/delphi/creating-threads para obtener una explicación de por qué funciona este código.

2

@mghie (un poco tarde, lo sé)

Tomemos por ejemplo madexcept y similares. Si su aplicación falla y un informe de error se muestra al usuario, eso significa que el diálogo espera la entrada de uso. Si sucede que el bloqueo es el resultado de una acción de subproceso (no necesariamente un bloqueo de subproceso), si no suspende los subprocesos, la pantalla se rellenará con cuadros de diálogo de informe de error.

ejemplo 2: inicio de sesión. por alguna razón en particular, al menos, tuve la necesidad de registrar algún estado de ejecución de subprocesos. Eso incluye el seguimiento de la pila actual. Ahora, como usted debería saber, no puede hacer eso mientras se está ejecutando el subproceso, porque durante el tiempo que recopile información al respecto, los subprocesos siguen haciendo cosas, por lo que cuando termine la recopilación, la información recopilada no será coherente. Por lo tanto, debe suspender el hilo.

Y puedo continuar con ejemplos prácticos sobre gestión de hilos. Por supuesto, estas no son cosas que haces en la programación diaria, pero al menos es el primer ejemplo que estoy seguro de que muchos de ustedes están usando, incluso si no están al tanto de los aspectos internos. Depuradores? de nuevo, los usa. Pero de hecho, en todos estos casos, TThread no se usa, ya que el trabajo se realiza en los controladores de subprocesos. Entonces, de hecho, es difícil encontrar un ejemplo válido de TThread. Pero hilos en general, esa es otra historia.

4

Por si acaso todo lo que quería hacer era deshacerse del compilador insinúa

(1) Para deshacerse de la pista compilador al iniciar un subproceso ...

reemplazar

MyThread := TMyThread.Create(True); 
MyThread.Resume; 

con

MyThread := TMyThread.Create(True); 
MyThread.Start; 

(2) Para deshacerse de la sugerencia del compilador cuando Detener un hilo ...

reemplazar

MyThread.Suspend; 
MyThread.Terminate; 

con

MyThread.Terminate; 
No

un gran problema en absoluto. Tenga cuidado con intento de ofuscación.

2

Uso

Suspended := False; // Resume; 

o

Start; 
No
Cuestiones relacionadas