2008-11-07 31 views

Respuesta

6

Ni siquiera intentaré explicar o escribir ningún código. Solo mira este tutorial. Es un poco viejo, pero muy bueno. Multithreading - The Delphi Way

+0

Gracias. Incluso el propio sitio del codegear tiene enlaces a una dirección incorrecta (anterior). – delphist

+0

sí ese tutorial se ha movido un poco! – Steve

+0

Gracias por el enlace al tutorial. – samir105

6

Puede tener un bucle de mensaje (posiblemente con una ventana de notificación oculta) en su hilo y enviarle un mensaje de Windows, o puede usar una forma más nativa (menos GUI) de hacerlo, como como una cola protegida por una sección crítica combinada con un evento de restablecimiento manual que el hilo espera y el hilo de envío envía señales.

Una solución más general es una cola productor-consumidor, que en la implementación clásica utiliza un par de semáforos para realizar un seguimiento de consumidores y productores y un tercer semáforo para acceso mutuamente exclusivo a la cola; sin embargo, hay colas más óptimas productor-consumidor disponibles en la red.

+4

Y recuerde, niños: NO use .Synchronize() si el rendimiento es su objetivo :) –

+0

No podría estar más de acuerdo. Si eso fuera una respuesta en lugar de un comentario, lo habría votado. Para una pequeña y agradable diatriba sobre los dos y los dont de TThread, vea también http://newsgroups.cryer.info/borland/public.delphi.internet.winsock/200507/0507273541.html – mghie

3

¿Por qué tendrías que hacerlo? Es solo por una razón que alguna vez tuve que crear un bucle de mensaje en un hilo secundario, y eso se debe a que el hilo utilizó objetos COM. Las llamadas a OleInitialize() y OleUnitialize() son una señal de que necesidad un estándar GetMessage() bucle. En ese caso, también es necesario simplemente enviar mensajes a ese hilo, usando PostThreadMessage(), porque las llamadas normales de sincronización de bloqueo interferirían con el ciclo del mensaje. De lo contrario, simplemente no lo hagas.

Si está en Delphi 2007 o 2009, asegúrese de consultar OmniThreadLibrary de Primož Gabrijelčič, debería hacer su trabajo mucho más fácil.

+0

¿Por qué tendría que hacerlo? Por ejemplo, tengo un hilo que está sondeando eventos de un servidor en cada 1000msec pero necesito cambiar la tasa de sondeo a 5000msec. Detener y luego volver a iniciar el hilo para este fin es demasiado. – grinner

+0

@tdiop: Para lograr esto, no es necesario enviar ningún mensaje al hilo, hay muchas otras formas mejores de hacerlo. Verifique las otras respuestas para inspirarse. – mghie

Cuestiones relacionadas