El tema del servicio es una solución muy buena, pero yo en mi caso intentaré hacerlo todo desde dentro del programa por varios motivos:
- Tener que instalar un segundo programa me genera más trabajo x cliente, en algunos pc's hay que configurar antivirus para que no mareen, permisos, etc... y en caso de reinstalación no es tan fácil como copiar la carpeta y a funcionar
- Si trabajo con librerías externas, cuando las actualizo, he de aplicarlas a ambos programas y testearlas ( más trabajo )
- Tener un servicio, requiere de una programación algo "diferente", el usuario no ve nada, no hay GUI, todo se gestiona en un log y si "peta" por algún motivo, hay que configurar bien el servicio para que reinicie y no se quede parado, pero claro, hay que realizar alguna acción adicional para que el servicio informe de que ha fallado, de lo contrario no nos enteramos.
- El servicio deberá tener un sistema de comunicación con el programa ( a nivel de log, sockets, o lo que sea ) para informar de los resultados de los envíos al usuario, por lo que el programa "Base" deberá tener también algún timer para recibir estos resultados o ya meterse en comunicaciones entre programas ( multihilo )
Bueno, creo que son cosas a tener en cuenta, igual las tenéis solucionadas, Perfect!!! yo por mi parte voy a intentar lo siguiente:
- El usuario hace una factura y el programa la mete en una cola de envíos
- Inmediatamente se envía a procesar la cola de envíos ( normalmente habrá 1 factura para enviar )
- Si se envía, Perfect!
- Si no se envía, se queda en cola pendiente, la cola se ejecutará en la próxima factura que se realice o también un proceso manual que el usuario pueda ejecutarla cuando quiera.
- Posible opción de meter un timer que revise la cola y cada X minutos y si hay algo que la ejecute
El tema de no hacer el envío con la opción de la factura y meterlo en la cola es por centralizar los envíos desde un solo proceso, así no tengo una llamada al envío al finalizar la factura y otra en el proceso de la cola de envíos incompletos.
Se que esto puede crear alguna pausa ya que no utilizo el multihilo y si el timer ejecuta el envío quizás moleste, pero esto solo pasará cuando haya algo en la cola que no se haya podido enviar, creo que ocurrirá muy pocas veces o casi nunca ( espero ). Otra opción sería activar el multihilo, pero solo por esta opción no creo que me valga la pena, ya que el rendimiento de las aplicaciones HB cuando compilas con -mt baja considerablemente.
Rectificadme y dadme un cachete si lo que pongo no tiene sentido
Buen debate!