Quiero enviar un mensaje a un hilo y manejarlo en el hilo. ¿Cómo puedo hacer esto en Delphi? Supongo que PostMessage
es el camino a seguir, pero los ejemplos que he visto hasta ahora están describiendo de otra manera, es decir, del hilo al hilo principal.¿Cómo enviar un mensaje a un TThread desde el hilo principal en Delphi?
Respuesta
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
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.
Y recuerde, niños: NO use .Synchronize() si el rendimiento es su objetivo :) –
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
¿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.
¿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
@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
- 1. cómo enviar un mensaje al proceso principal
- 2. Cómo matar un hilo en delphi?
- 3. mejor manera de enviar un mensaje a un hilo
- 4. Cómo pasar la excepción de un hilo a otro (el que llama) el hilo en Delphi?
- 5. Aplicación multiproceso (TThread) Delphi no terminará
- 6. Enviar datos a un hilo específico
- 7. Cómo crear un hilo Looper, y luego enviar un mensaje de inmediato?
- 8. llamando al hilo principal desde el hilo Runnable en java
- 9. ¿Llamar a un método en el hilo principal?
- 10. iOS: otro hilo necesita enviar reloadData al hilo principal
- 11. Enviar o publicar un mensaje en un bucle de mensaje de Windows Forms
- 12. ¿Es mejor utilizar "Sincronizar" de TThread o usar Mensajes de ventana para IPC entre el hilo principal y secundario?
- 13. ¿Registrar un mensaje enviar a nil?
- 14. ¿Reanudar hilo suspendido en Delphi 2010?
- 15. ¿Cómo enviar un mensaje sin un destino específico en MPI?
- 16. ¿Cómo envío un mensaje a stderr desde cmd?
- 17. ¿Debería invocarse URLForUbiquityContainerIdentifier en un hilo fuera del hilo principal?
- 18. ¿Cómo enviar un mensaje de sesión a un usuario anónimo en un sitio de Django?
- 19. Git: Enviar a un repositorio remoto con un mensaje
- 20. Cómo enviar un mensaje usando XMPP Framework
- 21. Libere un TThread de forma automática o manual
- 22. Mac OS X: ¿es posible imbuir un hilo no principal para convertirse en "El hilo principal" de un proceso?
- 23. NSURLConnection bloquea el hilo principal?
- 24. Uso de OpenGL desde el hilo principal en Android
- 25. Enviar mensaje en C#
- 26. ¿Cómo obtener datos hacia/desde un socket en un hilo?
- 27. Enviar un mensaje a un amigo, me pregunto Javascript API
- 28. Comunicación de hilo cruzado en Delphi
- 29. Obteniendo el mensaje más reciente en un hilo
- 30. Enviar mensaje a un proceso de Windows (no su ventana principal)
Gracias. Incluso el propio sitio del codegear tiene enlaces a una dirección incorrecta (anterior). – delphist
sí ese tutorial se ha movido un poco! – Steve
Gracias por el enlace al tutorial. – samir105