Puedes hacer dos cosas:
1. (lo más fácil)
Inmediatamente después del envío, metes otro for...next del tipo:
for i=1 to 1000
next i
Esto para el proceso, hasta que ejecuta toda la estructura for...next. Es posible que necesites tanto tiempo que tengas que encadenar dos estructuras, para no desbordar la variable de control:
for i=1 to 10000000 (ahora no recuerdo el rango de una Long)
for j=1 to 1000
next j
next i
Este truco es muy fácil de implementar, pero tiene grandes inconvenientes:
- Todo el entorno gráfico de la aplicación (entre otras cosas), queda parado, con lo que será bastante molesto de cara al usuario.
- Dependerás de la velocidad del microprocesador. A mí me ha dejado de funcionar correctamente una aplicación al cambiarla de ordenador, pasándoa de un PIII a un PIV.
2. Método seguro:
Emplea el evento de socket 'sockservidoratiende_SendComplete' para encadenar los envíos.
Es un método completo (edito: completo = complejo) pero seguro 100%. Debes tener una cola, hacer un envío desde fuera del objeto, y vaciar el resto de la cola haciendo envío cada vez que se te ejecute este evento.
A tener en cuenta:
- Es posible que un envío no se ejecute nunca (fallo del socket, de la red, etc). Debes tener previsto un timer de Time-Out, cuya propiedad 'interval' debe ser mayor que el tiempo que toma enviar un telegrama.
- Llenar la cola por abajo y vaciarla por arriba (para mantener el orden de los telegramas)
- No sé, me dejo cosas. Hazte un motorcillo y juega un poco con él, hasta que te quede depurado del todo.
indasc escribió:Puedes usar DoEvents(), pero este no pausa la ejecución solo da tiempo a otros procesos, tendrías que meterlo en un bucle que controlase el tiempo.
Pues claro que la función DoEvents() no detiene la ejecución, hace todo lo contrario. Cuando un proceso está detenido en un bucle, si no tiene la función DoEvents() queda detenida toda la aplicación. Lo que hace DoEvents() es dejar que la aplicación pueda recibir eventos mientras está detenida en dicho bucle.
Yo no usuaría métodos que paren (sleep, wait, etc...) porque son muy molestos cara la interface de usuario. LOS PROCESOS HAY QUE EJECUTARLO TAN RÁPIDO COMO SEA POSIBLE. Lo que yo haría (después de años programando en VB6) es tomar el 2º método que te explico. Es complejo y te irá dando algunas sorpresas. Pero si lo depuras bien, el motor que envía telegramas te quedará 100% robusto (o casi).
Suerte y saludos
indasc escribió:Estas seguro que el problema esta en que no le da tiempo a enviar el mensaje, cada objeto "sockservidoratiende" tiene su propio buffer, así que no debería interferir unos con otro.
¿De cuantos datos son los mensajes?
Te aseguro que con esa estructura el chaval está perdiendo telegramas.
Edito:
me dejo otro truco:
3. Con un timer.
- Pon un timer cuya propiedad interva sea mayor que el tiempo que se tarda en enviar un telegrama.
- Por defecto mantenlo con enabled = false. Para enviar, canvia su propiedad a enabled = true.
- Que el envío se haga llamado desde el evento Timer1_Timer, asegurándote antes de enviar que ya se ha enviado el último mensaje. Manera de asegurarte:
- poner una variable que se ponga a false en el evento 'sockservidoratiende_SendComplete', y a true en el evento 'Timer1_Timer' (antes de enviar). Esta variable te dirá si hay un envío en proceso.
Ten en cuenta que con este método seguirás necesitando el timer de control de time-out.
Este método es algo más sencillo que el 2º/, pero también tendrás que depurarlo algo.
En fin....mucha suerte. (siento explicarme tan mal)