Si no tiene experiencia con multi-threading, probablemente no debería comenzar con TThread
, ya que es una capa delgada sobre el threading nativo. Considero que también es un poco difícil en los bordes; no ha evolucionado mucho desde la introducción con Delphi 2, principalmente cambios para permitir la compatibilidad de Linux en el marco de tiempo de Kylix, y para corregir los defectos más obvios (como reparar la clase MREW rota y finalmente rechazar Suspend()
y Resume()
en la última versión Versión Delphi).
El uso de una clase de envoltura de hilo simple básicamente también hace que el desarrollador se concentre en un nivel que es demasiado bajo. Para hacer un uso adecuado de múltiples núcleos de CPU, es mejor centrarse en las tareas en lugar de en los subprocesos, porque la partición del trabajo con subprocesos no se adapta bien a los requisitos y entornos cambiantes; dependiendo del hardware y del otro software que se ejecute en paralelo, la cantidad óptima de los hilos pueden variar mucho, incluso en diferentes momentos en el mismo sistema. Una biblioteca a la que le pasa solo trozos de trabajo y que los programa automáticamente para hacer el mejor uso de los recursos disponibles ayuda mucho en este aspecto.
AsyncCalls es un buen primer paso para introducir subprocesos en una aplicación. Si tiene varias áreas en su programa donde se deben realizar varios pasos que son independientes entre sí, entonces simplemente puede ejecutarlos de forma asíncrona pasando cada uno de ellos a AsyncCalls. Incluso cuando solo tiene una de esas acciones que consumen mucho tiempo, puede ejecutarla de forma asincrónica y simplemente mostrar una UI de progreso en el hilo de la VCL, permitiendo opcionalmente cancelar la acción.
AsyncCalls es IMO no tan bueno para los trabajadores de fondo que permanecen durante todo el tiempo de ejecución del programa, y puede ser imposible de usar cuando algunos objetos en el programa tienen afinidad de subprocesos (como conexiones de bases de datos u objetos OLE que pueden tener un requisito de que todas las llamadas sucedan en el mismo hilo).
Lo que también debe tener en cuenta es que estas acciones asincrónicas son no del tipo "ignórense y olvidarse".Cada función AsyncCall()
sobrecargada devuelve un puntero de interfaz IAsyncCall
que puede necesitar para mantener una referencia si desea evitar el bloqueo. Si no conserva una referencia, en el momento en que el recuento de ref llega a cero, la interfaz se liberará, lo que hará que la secuencia que libera la interfaz espere a que se complete la llamada asincrónica. Esto es algo que podría ver durante la depuración, al salir del método que creó el IAsyncCall
puede tomar una cantidad de tiempo misteriosa.
OTL es, en mi opinión, la más versátil de sus tres opciones, y la usaría sin pensarlo dos veces. Puede hacer todo lo que TThread
y AsyncCalls pueden hacer, y mucho más. Tiene un diseño de sonido, que es de alto nivel suficiente para facilitar la vida del usuario y para permitir que un puerto a un sistema Unixy (manteniendo la mayor parte de la interfaz intacta) se vea al menos posible, si no fácil. En los últimos meses también ha comenzado a adquirir algunos constructos de alto nivel para el trabajo paralelo, muy recomendado.
OTL también tiene unas pocas docenas de muestras, lo cual es importante para empezar. AsyncCalls no tiene más que unas líneas en los comentarios, pero luego es bastante fácil de entender debido a su funcionalidad limitada (solo hace una cosa, pero lo hace bien). TThread
tiene solo una muestra, que no ha cambiado realmente en 14 años y es principalmente un ejemplo de cómo no hacer las cosas.
Cualquiera que sea la opción que elijas, ninguna biblioteca eliminará la necesidad de comprender los conceptos básicos de threading. Después de leer un buen libro sobre estos es un requisito previo para cualquier codificación exitosa. El bloqueo adecuado, por ejemplo, es un requisito para todos ellos.
Excelente respuesta. Estoy comenzando a explorar la posibilidad de agregar subprocesos a mi aplicación que tiene algunas conversaciones ocasionalmente largas con mi base de datos y realmente quiero que deje de estar sentado allí como un orador público que ha perdido su hilo. Necesitaba solo este tipo de resumen. – jrodenhi