Necesito un consejo en la codificación adecuada:¿Buena codificación? (Bucles de mensajes múltiples)
Estoy trabajando en un programa donde se usan múltiples conexiones en serie. Cada línea de comunicación tiene un controlador que funciona como una capa de abstracción. Entre el controlador y el puerto serie, se inserta un protocolo para envolver los datos en paquetes, listos para la transferencia. El protocolo se ocupa de entregas fallidas, reenvío, etc. Para garantizar que la GUI no se bloquee, cada línea de conexión (protocolo y puerto serie) se crea en una cadena separada. El controlador es manejado por el hilo principal, ya que tiene controles en la GUI.
Actualmente, cuando creo los hilos, he elegido crear un bucle de mensajes sobre ellos (Application.Run()), por lo que en lugar de sondear buffers y ceder si no funciona, simplemente invoco el hilo (BeginInvoke) y lo uso el bucle de mensaje como un búfer. Esto actualmente funciona bien, y no hay problemas serios hasta el momento.
Mi pregunta es ahora: ¿Es esta "buena codificación", o debería usar un bucle while en la banda de rodadura y ser buffers de sondeo en su lugar ?, o una tercera cosa?
Me gustaría mostrar el código, pero hasta el momento se trata de varios miles de líneas de código, así que sea específico si necesita ver alguna parte del código. :)
Gracias.
No realmente, no. WM_COPYDATA está bien para comunicarse entre procesos. No tiene sentido usarlo para comunicarse entre hilos dentro de un proceso. Es mucho más fácil/simple pasar los objetos de buffer/blob/whatever por puntero, ej. lanzando el * Buffer al mensaje.lParam, PostMessage() ing y casting en el 'otro extremo'. –
Las colas de mensajes de Windows están optimizadas para comunicar hilos de GUI. No son óptimos para comunicarse desde subprocesos GUI a subprocesos de trabajo que no son GUI. Incluso una simple cola productor-consumidor no optimizada basada en semáforos es aproximadamente cuatro veces más rápida que una WMQ. En la mayoría de las aplicaciones, el rendimiento de la cola P-C normalmente no es un problema de todos modos. –
Estoy de acuerdo en ambos puntos en realidad. Editaré WM_COPYDATA; No estaba pensando claramente. En cuanto a la cola de mensajes, es una solución generalizada basada en eventos. Dependiendo de los requisitos de su aplicación, otros modelos podrían ser mejores. – tenfour