2009-01-13 21 views

Respuesta

11

Solo puede enviar mensajes (Windows) a hilos que implementen un bucle de mensaje estándar, que se creará automáticamente una vez que se haya realizado el control de ventana.

Sin embargo, no es necesario utilizar mensajes para comunicarse con un hilo. Simplemente déjalo esperar en un objeto de evento (TEvent en VCL), e indica este evento cuando quieras que el hilo realice una función.

Pero si es nuevo en multi-threading, no profundice en todos estos detalles, a menos que desee obtener el efecto de aprendizaje. Solo use el OmniThreadLibrary y termine con eso. Se puede aprender mucho profundizando en sus partes internas, una vez que sepa cómo usarlo.

Editar:

Ver también las respuestas a this question que es muy similar.

Edición 2:

En cuanto al comentario preguntar "¿Qué [OmniThreadLibrary] hacer más fácil, ya qué costo?" Solo puedo aconsejarle que lo compruebe usted mismo, es decir, si está utilizando al menos Delphi 2007. Hay varias muestras para ilustrar los conceptos, pero para un ejemplo rápido de "vida real", puede consultar this blog post - ni siquiera necesita instalar la biblioteca para eso.

También estoy de acuerdo que el uso de una biblioteca para multi-threading requiere un cierto acto de fe. OTOH arreglándose con lo que ofrece el VCL es apenas una alternativa. El código de ejemplo todavía usa la llamada Synchronize() mal concebida. No hay soporte para cosas como colas productor-consumidor-hilo seguro, que son mucho más adecuadas para la programación de subprocesos múltiples. Y si está de acuerdo en que necesita un fundamento más sólido para sus programas de subprocesos múltiples que lo que ofrece el VCL, ¿por qué reinventar esa rueda en particular?

En cuanto al costo de usar la biblioteca: Tendrá que cronometrar si es lo suficientemente rápido para usted. Resumen la comunicación entre los hilos de una buena manera en mi humilde opinión, pero cada abstracción cuesta el rendimiento, obviamente.

Si decide que no es para usted, escriba el código usted mismo. Hice lo mismo con Delphi 4, y he estado usando ese código durante casi 10 años. Y a juzgar por la cantidad de errores que encontré y casos de esquina que experimenté en ese momento, definitivamente recomendaría a cualquier persona nueva en multi-threading a no escribir su propio código de biblioteca para ello. Y si realmente realmente desea, por favor, tome las reglas en this posting en el corazón.

+0

De hecho, use OmniThreadLibrary –

+0

Estoy en la misma situación que el OP. Sé muy poco para saber qué hace OmniThreadLibrary para mí, además de "hacerlo más fácil". ¿Qué hace que sea más fácil y a qué costo? Además, está el tema de las "abstracciones con fugas": si algo sale mal, la lib obstruirá la vista del problema. –

+0

OTL hace algo similar al VCL: oculta la fealdad inherente de trabajar directamente con threads. También le permitirá trabajar directamente con las primitivas de Windows subyacentes tanto como desee (igual que el VCL, nuevamente). Para obtener más información, utiliza http://otl.17slon.com/forum. – gabr

-1

Si usted tiene una referencia al objeto hilo, sólo puede llamar a dirigir, y tener la información del almacén procedimiento o actualizar en consecuencia. Obviamente, debes tener cuidado de hacer las cosas de manera segura.

Como alternativa, podría usar un objeto de control central a través del cual los hilos se comunican cuando no están ocupados. Tengo una aplicación donde los hilos tienen propósitos particulares, y se les asigna un ID de hilo.Cualquier hilo puede "publicar" un mensaje con un ID de mensaje y una cadena de parámetros en otro ID de hilo y luego continuar con su trabajo. El otro hilo lo recoge en su tiempo libre, y actúa en consecuencia.

Cuestiones relacionadas