![]() |
| |||||||
| Registrarse | Preguntas Frecuentes | Lista de Foreros | Calendario | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
| | LinkBack | Herramientas | Desplegado |
| |||
| Hola a todos: Estoy haciendo una aplicación cliente/servidor con Visual Basic 6. Para ello utilizo el control Winsock. Y ha ido funcionando perfectamente hasta ahora, que le ha dado por no saltar el evento SendComplete. Al ejecutar el WS.SendData mensaje, el mensaje llega al servidor (lo he comprobado), pero no llega a saltar el evento SendComplete ni el SendProgress, con lo cual se me queda parado en el bucle que le tengo puesto: WS.SendData mensaje do doevents esperar 100 loop until enviocompleto=true Ni que decir tiene que la variable enviocompleto la pone a True el evento SendComplete. También he probado a quitar la espera de 100 milisegundos, y tampoco tira. ¿A alguien se le ocurre por qué puede estar ocurriendo ésto? Muchas gracias de antemano. P.D.: Por si es necesario: Este es el código de "esperar": ' ' SIPNOSIS: esperar ' ' ENTRADA: ' Ningún argumento de entrada ' ' SALIDA: ' Ningún argumento de salida ' ' FUNCIONAMIENTO: Procedimiento que incorpora ciclos de espera de un tiempo ' determinado. '_________________________________________________ ___________________________________ Public Sub esperar(ByVal numMiliSeg As Long) Dim TmFin As Long Dim TmEspera As Long 'Valor de la espera (en Mseg) TmEspera = numMiliSeg TmFin = GetTickCount + TmEspera Do While GetTickCount < TmFin DoEvents Loop End Sub Este es el código del envío: Public Function enviar(Socket As Winsock, mensaje As String) As Integer On Error GoTo manejoerror If (Socket.State = sckOpen Or Socket.State = sckConnected) Then Socket.SendData mensaje Do ' esperar 100 DoEvents Loop While (Not enviocompleto) enviocompleto = False End If enviar = 0 Exit Function manejoerror: enviar = 1 Exit Function End Function Y este el del SendComplete (trivial): Private Sub WSFaplicacion_SendComplete() enviocompleto = True End Sub |
| | ||||
| ||||
| |
| |||
| El 12 Sep 2005 08:36:34 -0700, "lestat_l" <lestat_l***zensearch.com> escribió: >Al ejecutar el WS.SendData mensaje, el mensaje llega al servidor (lo he >comprobado), pero no llega a saltar el evento SendComplete ni el >SendProgress, con lo cual se me queda parado en el bucle que le tengo >puesto: > >WS.SendData mensaje >do > doevents > esperar 100 >loop until enviocompleto=true Mal hecho. Debes basar tu aplicación en eventos, y nunca en espera activa. Deja tu aplicación libre y salte de ese procedimiento a la espera de que te llegue el evento. >¿A alguien se le ocurre por qué puede estar ocurriendo ésto? No estás programando la aplicación de la manera correcta. >Public Sub esperar(ByVal numMiliSeg As Long) >Dim TmFin As Long >Dim TmEspera As Long 'Valor de la espera (en Mseg) > >TmEspera = numMiliSeg >TmFin = GetTickCount + TmEspera >Do While GetTickCount < TmFin >DoEvents >Loop >End Sub ¡Espera activa de nuevo! Tu aplicación debe comerse el tiempo de CPU de tu procesador que da gusto. Deberías plantearte que alguien con conocimientos te explicase cómo funciona el sistema basado en eventos que usa Windows para evitar el uso de la CPU mientras llega o no algo. Son bienvenidos tutoriales, manuales, etc... En cuanto tenga un pequeño hueco te hago un ejemplo de cómo debes hacer correctamente lo que deseas hacer. Un saludo. -- Óscar Javier García Baudet LinaresDigital http://redstar.linaresdigital.com/ |
| |||
| El 12 Sep 2005 08:36:34 -0700, "lestat_l" <lestat_l***zensearch.com> escribió: >Al ejecutar el WS.SendData mensaje, el mensaje llega al servidor (lo he >comprobado), pero no llega a saltar el evento SendComplete ni el >SendProgress, con lo cual se me queda parado en el bucle que le tengo >puesto: > >WS.SendData mensaje >do > doevents > esperar 100 >loop until enviocompleto=true Mal hecho. Debes basar tu aplicación en eventos, y nunca en espera activa. Deja tu aplicación libre y salte de ese procedimiento a la espera de que te llegue el evento. >¿A alguien se le ocurre por qué puede estar ocurriendo ésto? No estás programando la aplicación de la manera correcta. >Public Sub esperar(ByVal numMiliSeg As Long) >Dim TmFin As Long >Dim TmEspera As Long 'Valor de la espera (en Mseg) > >TmEspera = numMiliSeg >TmFin = GetTickCount + TmEspera >Do While GetTickCount < TmFin >DoEvents >Loop >End Sub ¡Espera activa de nuevo! Tu aplicación debe comerse el tiempo de CPU de tu procesador que da gusto. Deberías plantearte que alguien con conocimientos te explicase cómo funciona el sistema basado en eventos que usa Windows para evitar el uso de la CPU mientras llega o no algo. Son bienvenidos tutoriales, manuales, etc... En cuanto tenga un pequeño hueco te hago un ejemplo de cómo debes hacer correctamente lo que deseas hacer. Un saludo. -- Óscar Javier García Baudet LinaresDigital http://redstar.linaresdigital.com/ |
| |||
| El 12 Sep 2005 08:36:34 -0700, "lestat_l" <lestat_l***zensearch.com> escribió: >Al ejecutar el WS.SendData mensaje, el mensaje llega al servidor (lo he >comprobado), pero no llega a saltar el evento SendComplete ni el >SendProgress, con lo cual se me queda parado en el bucle que le tengo >puesto: > >WS.SendData mensaje >do > doevents > esperar 100 >loop until enviocompleto=true Mal hecho. Debes basar tu aplicación en eventos, y nunca en espera activa. Deja tu aplicación libre y salte de ese procedimiento a la espera de que te llegue el evento. >¿A alguien se le ocurre por qué puede estar ocurriendo ésto? No estás programando la aplicación de la manera correcta. >Public Sub esperar(ByVal numMiliSeg As Long) >Dim TmFin As Long >Dim TmEspera As Long 'Valor de la espera (en Mseg) > >TmEspera = numMiliSeg >TmFin = GetTickCount + TmEspera >Do While GetTickCount < TmFin >DoEvents >Loop >End Sub ¡Espera activa de nuevo! Tu aplicación debe comerse el tiempo de CPU de tu procesador que da gusto. Deberías plantearte que alguien con conocimientos te explicase cómo funciona el sistema basado en eventos que usa Windows para evitar el uso de la CPU mientras llega o no algo. Son bienvenidos tutoriales, manuales, etc... En cuanto tenga un pequeño hueco te hago un ejemplo de cómo debes hacer correctamente lo que deseas hacer. Un saludo. -- Óscar Javier García Baudet LinaresDigital http://redstar.linaresdigital.com/ |
| |||
| El 12 Sep 2005 08:36:34 -0700, "lestat_l" <lestat_l***zensearch.com> escribió: >Al ejecutar el WS.SendData mensaje, el mensaje llega al servidor (lo he >comprobado), pero no llega a saltar el evento SendComplete ni el >SendProgress, con lo cual se me queda parado en el bucle que le tengo >puesto: > >WS.SendData mensaje >do > doevents > esperar 100 >loop until enviocompleto=true Mal hecho. Debes basar tu aplicación en eventos, y nunca en espera activa. Deja tu aplicación libre y salte de ese procedimiento a la espera de que te llegue el evento. >¿A alguien se le ocurre por qué puede estar ocurriendo ésto? No estás programando la aplicación de la manera correcta. >Public Sub esperar(ByVal numMiliSeg As Long) >Dim TmFin As Long >Dim TmEspera As Long 'Valor de la espera (en Mseg) > >TmEspera = numMiliSeg >TmFin = GetTickCount + TmEspera >Do While GetTickCount < TmFin >DoEvents >Loop >End Sub ¡Espera activa de nuevo! Tu aplicación debe comerse el tiempo de CPU de tu procesador que da gusto. Deberías plantearte que alguien con conocimientos te explicase cómo funciona el sistema basado en eventos que usa Windows para evitar el uso de la CPU mientras llega o no algo. Son bienvenidos tutoriales, manuales, etc... En cuanto tenga un pequeño hueco te hago un ejemplo de cómo debes hacer correctamente lo que deseas hacer. Un saludo. -- Óscar Javier García Baudet LinaresDigital http://redstar.linaresdigital.com/ |
| |||
| El 12 Sep 2005 08:36:34 -0700, "lestat_l" <lestat_l***zensearch.com> escribió: >Al ejecutar el WS.SendData mensaje, el mensaje llega al servidor (lo he >comprobado), pero no llega a saltar el evento SendComplete ni el >SendProgress, con lo cual se me queda parado en el bucle que le tengo >puesto: > >WS.SendData mensaje >do > doevents > esperar 100 >loop until enviocompleto=true Mal hecho. Debes basar tu aplicación en eventos, y nunca en espera activa. Deja tu aplicación libre y salte de ese procedimiento a la espera de que te llegue el evento. >¿A alguien se le ocurre por qué puede estar ocurriendo ésto? No estás programando la aplicación de la manera correcta. >Public Sub esperar(ByVal numMiliSeg As Long) >Dim TmFin As Long >Dim TmEspera As Long 'Valor de la espera (en Mseg) > >TmEspera = numMiliSeg >TmFin = GetTickCount + TmEspera >Do While GetTickCount < TmFin >DoEvents >Loop >End Sub ¡Espera activa de nuevo! Tu aplicación debe comerse el tiempo de CPU de tu procesador que da gusto. Deberías plantearte que alguien con conocimientos te explicase cómo funciona el sistema basado en eventos que usa Windows para evitar el uso de la CPU mientras llega o no algo. Son bienvenidos tutoriales, manuales, etc... En cuanto tenga un pequeño hueco te hago un ejemplo de cómo debes hacer correctamente lo que deseas hacer. Un saludo. -- Óscar Javier García Baudet LinaresDigital http://redstar.linaresdigital.com/ |
| |||
| El 12 Sep 2005 08:36:34 -0700, "lestat_l" <lestat_l***zensearch.com> escribió: >Al ejecutar el WS.SendData mensaje, el mensaje llega al servidor (lo he >comprobado), pero no llega a saltar el evento SendComplete ni el >SendProgress, con lo cual se me queda parado en el bucle que le tengo >puesto: > >WS.SendData mensaje >do > doevents > esperar 100 >loop until enviocompleto=true Mal hecho. Debes basar tu aplicación en eventos, y nunca en espera activa. Deja tu aplicación libre y salte de ese procedimiento a la espera de que te llegue el evento. >¿A alguien se le ocurre por qué puede estar ocurriendo ésto? No estás programando la aplicación de la manera correcta. >Public Sub esperar(ByVal numMiliSeg As Long) >Dim TmFin As Long >Dim TmEspera As Long 'Valor de la espera (en Mseg) > >TmEspera = numMiliSeg >TmFin = GetTickCount + TmEspera >Do While GetTickCount < TmFin >DoEvents >Loop >End Sub ¡Espera activa de nuevo! Tu aplicación debe comerse el tiempo de CPU de tu procesador que da gusto. Deberías plantearte que alguien con conocimientos te explicase cómo funciona el sistema basado en eventos que usa Windows para evitar el uso de la CPU mientras llega o no algo. Son bienvenidos tutoriales, manuales, etc... En cuanto tenga un pequeño hueco te hago un ejemplo de cómo debes hacer correctamente lo que deseas hacer. Un saludo. -- Óscar Javier García Baudet LinaresDigital http://redstar.linaresdigital.com/ |
| |||
| El 12 Sep 2005 08:36:34 -0700, "lestat_l" <lestat_l***zensearch.com> escribió: >Estoy haciendo una aplicación cliente/servidor con Visual Basic 6. >Para ello utilizo el control Winsock. Y ha ido funcionando >perfectamente hasta ahora, que le ha dado por no saltar el evento >SendComplete. Espero que este ejemplo te ilumine. Le falta muchos detalles (como detección de errores), pero espero que sea lo suficientemente autoexplicativo como para que comprendas cómo funciona la programación usando eventos. Si quieres el código completo (con proyecto, etc) envíame un email y te lo envío. Dim Host As String Dim Puerto As Integer Dim Longitud As Long Dim Numero As Long Dim Enviados As Long Dim Recibidos As Long Private Sub cmdComenzar_Click() ' Conectaremos a un servidor de "echo" (eco) Puerto = 7 Host = "pon.aqui.un.servidor.de.eco.publico.o.tuyo.privad o" Longitud = 512 Numero = 1024 ' Configuramos las barras de progreso Enviados = 0 Recibidos = 0 pbEnviados.Min = 0 pbEnviados.Max = Numero * Longitud pbEnviados.Value = Enviados pbRecibidos.Min = 0 pbRecibidos.Max = Numero * Longitud pbRecibidos.Value = Recibidos ' Configuramos los datos y nos quedamos a la espera de la conexión cmdComenzar.Enabled = False wsEco.RemotePort = Puerto wsEco.RemoteHost = Host sbStatus.Panels(1).Text = "Conectando con " & Host wsEco.Connect End Sub Private Sub Form_Load() sbStatus.Panels(1).Text = "En reposo" End Sub Private Sub wsEco_Connect() ' Enviamos el primer paquete (al enviarlo se producirá el evento SendComplete) EnviarDatos End Sub Private Sub wsEco_SendComplete() ' Enviamos el resto de paquetes EnviarDatos End Sub Private Sub wsEco_DataArrival(ByVal bytesTotal As Long) Dim Datos As String Recibidos = Recibidos + bytesTotal pbRecibidos.Value = Recibidos sbStatus.Panels(1).Text = "Enviando (" & Enviados & "/" & Recibidos & ")" wsEco.GetData Datos If Recibidos = (Numero * Longitud) Then cmdComenzar.Enabled = True sbStatus.Panels(1).Text = "Conexión cerrada (en reposo)" wsEco.Close End If End Sub Private Sub wsEco_Close() cmdComenzar.Enabled = True sbStatus.Panels(1).Text = "Conexión cerrada por el otro extremo (en reposo)" End Sub Private Sub EnviarDatos() Dim Datos As String If Enviados < (Numero * Longitud) Then Enviados = Enviados + Longitud sbStatus.Panels(1).Text = "Enviando (" & Enviados & "/" & Recibidos & ")" Datos = String(Longitud - 2, "A") Datos = Datos & vbCrLf wsEco.SendData Datos pbEnviados.Value = Enviados End If End Sub Un saludo. -- Óscar Javier García Baudet LinaresDigital http://redstar.linaresdigital.com/ |
| |
| |
| |||
| El 12 Sep 2005 08:36:34 -0700, "lestat_l" <lestat_l***zensearch.com> escribió: >Estoy haciendo una aplicación cliente/servidor con Visual Basic 6. >Para ello utilizo el control Winsock. Y ha ido funcionando >perfectamente hasta ahora, que le ha dado por no saltar el evento >SendComplete. Espero que este ejemplo te ilumine. Le falta muchos detalles (como detección de errores), pero espero que sea lo suficientemente autoexplicativo como para que comprendas cómo funciona la programación usando eventos. Si quieres el código completo (con proyecto, etc) envíame un email y te lo envío. Dim Host As String Dim Puerto As Integer Dim Longitud As Long Dim Numero As Long Dim Enviados As Long Dim Recibidos As Long Private Sub cmdComenzar_Click() ' Conectaremos a un servidor de "echo" (eco) Puerto = 7 Host = "pon.aqui.un.servidor.de.eco.publico.o.tuyo.privad o" Longitud = 512 Numero = 1024 ' Configuramos las barras de progreso Enviados = 0 Recibidos = 0 pbEnviados.Min = 0 pbEnviados.Max = Numero * Longitud pbEnviados.Value = Enviados pbRecibidos.Min = 0 pbRecibidos.Max = Numero * Longitud pbRecibidos.Value = Recibidos ' Configuramos los datos y nos quedamos a la espera de la conexión cmdComenzar.Enabled = False wsEco.RemotePort = Puerto wsEco.RemoteHost = Host sbStatus.Panels(1).Text = "Conectando con " & Host wsEco.Connect End Sub Private Sub Form_Load() sbStatus.Panels(1).Text = "En reposo" End Sub Private Sub wsEco_Connect() ' Enviamos el primer paquete (al enviarlo se producirá el evento SendComplete) EnviarDatos End Sub Private Sub wsEco_SendComplete() ' Enviamos el resto de paquetes EnviarDatos End Sub Private Sub wsEco_DataArrival(ByVal bytesTotal As Long) Dim Datos As String Recibidos = Recibidos + bytesTotal pbRecibidos.Value = Recibidos sbStatus.Panels(1).Text = "Enviando (" & Enviados & "/" & Recibidos & ")" wsEco.GetData Datos If Recibidos = (Numero * Longitud) Then cmdComenzar.Enabled = True sbStatus.Panels(1).Text = "Conexión cerrada (en reposo)" wsEco.Close End If End Sub Private Sub wsEco_Close() cmdComenzar.Enabled = True sbStatus.Panels(1).Text = "Conexión cerrada por el otro extremo (en reposo)" End Sub Private Sub EnviarDatos() Dim Datos As String If Enviados < (Numero * Longitud) Then Enviados = Enviados + Longitud sbStatus.Panels(1).Text = "Enviando (" & Enviados & "/" & Recibidos & ")" Datos = String(Longitud - 2, "A") Datos = Datos & vbCrLf wsEco.SendData Datos pbEnviados.Value = Enviados End If End Sub Un saludo. -- Óscar Javier García Baudet LinaresDigital http://redstar.linaresdigital.com/ |
| |||
| El 12 Sep 2005 08:36:34 -0700, "lestat_l" <lestat_l***zensearch.com> escribió: >Estoy haciendo una aplicación cliente/servidor con Visual Basic 6. >Para ello utilizo el control Winsock. Y ha ido funcionando >perfectamente hasta ahora, que le ha dado por no saltar el evento >SendComplete. Espero que este ejemplo te ilumine. Le falta muchos detalles (como detección de errores), pero espero que sea lo suficientemente autoexplicativo como para que comprendas cómo funciona la programación usando eventos. Si quieres el código completo (con proyecto, etc) envíame un email y te lo envío. Dim Host As String Dim Puerto As Integer Dim Longitud As Long Dim Numero As Long Dim Enviados As Long Dim Recibidos As Long Private Sub cmdComenzar_Click() ' Conectaremos a un servidor de "echo" (eco) Puerto = 7 Host = "pon.aqui.un.servidor.de.eco.publico.o.tuyo.privad o" Longitud = 512 Numero = 1024 ' Configuramos las barras de progreso Enviados = 0 Recibidos = 0 pbEnviados.Min = 0 pbEnviados.Max = Numero * Longitud pbEnviados.Value = Enviados pbRecibidos.Min = 0 pbRecibidos.Max = Numero * Longitud pbRecibidos.Value = Recibidos ' Configuramos los datos y nos quedamos a la espera de la conexión cmdComenzar.Enabled = False wsEco.RemotePort = Puerto wsEco.RemoteHost = Host sbStatus.Panels(1).Text = "Conectando con " & Host wsEco.Connect End Sub Private Sub Form_Load() sbStatus.Panels(1).Text = "En reposo" End Sub Private Sub wsEco_Connect() ' Enviamos el primer paquete (al enviarlo se producirá el evento SendComplete) EnviarDatos End Sub Private Sub wsEco_SendComplete() ' Enviamos el resto de paquetes EnviarDatos End Sub Private Sub wsEco_DataArrival(ByVal bytesTotal As Long) Dim Datos As String Recibidos = Recibidos + bytesTotal pbRecibidos.Value = Recibidos sbStatus.Panels(1).Text = "Enviando (" & Enviados & "/" & Recibidos & ")" wsEco.GetData Datos If Recibidos = (Numero * Longitud) Then cmdComenzar.Enabled = True sbStatus.Panels(1).Text = "Conexión cerrada (en reposo)" wsEco.Close End If End Sub Private Sub wsEco_Close() cmdComenzar.Enabled = True sbStatus.Panels(1).Text = "Conexión cerrada por el otro extremo (en reposo)" End Sub Private Sub EnviarDatos() Dim Datos As String If Enviados < (Numero * Longitud) Then Enviados = Enviados + Longitud sbStatus.Panels(1).Text = "Enviando (" & Enviados & "/" & Recibidos & ")" Datos = String(Longitud - 2, "A") Datos = Datos & vbCrLf wsEco.SendData Datos pbEnviados.Value = Enviados End If End Sub Un saludo. -- Óscar Javier García Baudet LinaresDigital http://redstar.linaresdigital.com/ |
![]() |
| Herramientas | |
| Desplegado | |
| |
Temas Similares | ||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Evento | Antonio Jose | Newsgroup microsoft.public.es.sharepoint | 6 | 24-06-2008 14:38:00 |
| Nombre del evento de problema: APPCRASH | Gildun | Newsgroup microsoft.public.es.windowsvista | 3 | 09-05-2008 01:08:16 |
| problema con evento onkeypress y enter | Juan | Newsgroup microsoft.public.es.java | 0 | 05-12-2005 15:12:12 |
| Problema con evento | Socaire | Newsgroup es.comp.lenguajes.visual-basic | 18 | 19-09-2005 11:03:03 |
| ¿en que evento? | Luis | Newsgroup es.comp.lenguajes.visual-basic | 0 | 17-04-2005 22:49:02 |