versiones edition descargar community borland delphi delphi-2010

edition - TThread.resume está en desuso en Delphi-2010, ¿qué debería usarse en su lugar?



delphi versiones (8)

@mghie (un poco tarde, lo sé)

tomar 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: registro. 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 administració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 identificadores de subprocesos. Entonces, de hecho, es difícil encontrar un ejemplo válido de TThread. Pero hilos en general, esa es otra historia.

En mi aplicación multiproceso

Yo uso TThread.suspend y TThread.resume

Desde que moví mi aplicación a Delphi 2010 recibí el siguiente mensaje en conflicto

[Advertencia de DCC] xxx.pas (277): el símbolo ''Currículum'' de W1000 está en desuso

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

EDIT 1:

Utilizo el comando Reanudar para iniciar el hilo, ya que está Creado con ''CreateSuspended'' establecido en True y Suspend antes de terminar el hilo.

EDICION 2:

Aquí hay un enlace del manual delphi 2010


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 hilos, puede usar un esquema basado en TMutex, TEvent y secciones críticas.

Adiós.


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 forma, no es necesario llamar a Start.

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


El código de control de comportamiento del hilo debería estar en un procedimiento de hilo. 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.


Use TThread.Start en lugar de .Resume

--EDIT-- Start puede, por supuesto, usarse solo con Delphi 2010 (y más tarde, presumiblemente) para iniciar un hilo que se haya creado suspendido (donde antes habría utilizado el currículum).

No se recomienda el uso de Resume / Suspend (o las funciones correspondientes de WinAPI) para la sincronización de subprocesos. Vea la discusión here (eche un vistazo a los comentarios de Barry Kelly).


Utilizar

Suspended := False; // Resume;

o

Start;


Solo en caso de que todo lo que quisieras hacer fuera deshacerte de los consejos del compilador

(1) Para deshacerse de la sugerencia del compilador al iniciar un hilo ...

reemplazar

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

con

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

(2) Deshacerse de la sugerencia del compilador al detener un hilo ...

reemplazar

MyThread.Suspend; MyThread.Terminate;

con

MyThread.Terminate;

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


Suspender y Reanudar estaban (o solían ser) potencialmente rotos en la clase TThread (si miras la fuente verás que el método Suspenda establece directa e incondicionalmente un booleano al estado suspendido de hilo indicado en lugar de derivar este estado de forma más robusta del la ejecución cuenta 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 cual han sido desaprobados. 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 había 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 aparecen en la documentación de la API de Windows para suspender / reanudar la secuencia.

Si usar métodos en desuso te pone nervioso y aún deseas suspender / reanudar, siempre puedes usar la API de Windows para suspender y reanudar el hilo por referencia a su manejo .