Esperar conexión de Winsock

Iniciado por iaorengo, 8 Noviembre 2011, 02:47 AM

0 Miembros y 2 Visitantes están viendo este tema.

iaorengo

Buenas,

Estoy realmente agradecido por lo que me han ayudado y por la infinita información que pude encontrar. :D

Pero ahora estoy ante un problema que no encontré solución y espero me puedan dar una manito.

Estoy haciendo un Cliente-Servidor y tengo un problemita de "tiempo de demora" en el Winsock del Cliente. Ya que, con un botón solicito conexión con el Servidor pero como lleva un tiempo en conectar, me sale error al resto del sub, me dice que no tiene conexión. Si separo las funciones de Conectar y el resto en botones separadas, funciona perfecto.

Les muestro:

CitarPrivate Sub Command2_Click()
If Command2.Caption = "Connect" Then
Winsock1.RemoteHost = Text3.Text
Winsock1.RemotePort = Text4.Text
Winsock1.Close
Winsock1.Connect

If Winsock1.State <> sckConnected Then
'REPETIR HASTA QUE SEA IGUAL A CONECTADO PARA SALIR Y CONTINUAR EL SUB.
End If

Command2.Caption = "Disconnect"
Command2.FontBold = False

Else
Winsock1.Close
Text1.Text = Text1.Text & "*** Conexion cerrada por el usuario." & vbCrLf
Command2.Caption = "Connect"
Command2.FontBold = True
End If
End sub

Lo que está en rojo es lo que se me ocurrió hacer para "esperar" a que se conecte el Winsock para poder continuar. Lo que necesito es algo para poder hacer esa "espera" que está en negrita.

¿Existe alguna forma de solucionar esto sin tener que usar el famoso y detestable Sleep?



Desde ya, muchísimas gracias :)

BlackZeroX

Winsock tiene un evento llamado: connect (o algo asi no recuerdo bien) de esa manera no nesesitas el Bucle feo ese que usas.

Dulces Luneas
The Dark Shadow is my passion.

Elemental Code

para contestarte bien a tu pregunta.

en lugar de sleep algo "parecido" es

DoEvents

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas

iaorengo

Utilicé:

Do While Winsock1.State <> sckConnected 
      DoEvents 
Loop 



No se como es que funciona porque no se que hace cuando está el "DoEvents" pero resultó de maravillas.

Muchísimas gracias :)

Voy a terminar pintando en la pared de mi habitación "elhacker.net"


Son muy grosos.

BlackZeroX

#4
.
Es mejor que uses el evento:

Código (Vb) [Seleccionar]


Private Sub Winsock1_Connect()
' este codigo se ejcutara cuando el Socket apenas se conecte
End Sub



Nota: DoEvents no tiene nada que ver con Sleep, es mas ni se parecen... pero tienen una relacion.

Dulces Lunas!¡.
The Dark Shadow is my passion.

Elemental Code

doevents cede el lugar enla cola del procesador a otro programa. Esto desencadena que nuestro programa espere.

Estoy seguro que es mejor como dice black.

El problema que yo experimente con el doevents es que otros softwares tienen instrucciones muy complejas y no ceden el procesador. Entonces un doevents podria hacer esperar tu app por 30 seg o mas :S

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas

BlackZeroX

Cita de: Elemental Code en  8 Noviembre 2011, 10:20 AM
doevents cede el lugar enla cola del procesador a otro programa. Esto desencadena que nuestro programa espere.

Nada que ver, el encargado de eso es el Scheduler del S.O. no de DoEvents...

Lo que hace DoEvents es permitir a otr@(s) funciones/procesos su ejecucion como vb6 no permite Multihilos (Bueno si los permite pero son un ASCO la verdad) un simple Do While traba POR COMPLETO TU APP.

Dulces Lunas!¡.
The Dark Shadow is my passion.

BlackZeroX

#7
Cita de: Elemental Code en  8 Noviembre 2011, 10:20 AM
El problema que yo experimente con el doevents es que otros softwares tienen instrucciones muy complejas y no ceden el procesador. Entonces un doevents podria hacer esperar tu app por 30 seg o mas :S

Posiblemente pero tambien tiene que ver la prioridad con la que estan dichos PROGRAMAS ajenos al nuestro, solo tendriamos que cambiar la prioridad de la clase de nosotros para que asi el scheduler nos atienda mas frecuentemente...

Mira te doy un ejemplo muy facil de entender que te acabo de hacer.

En un form pega esto:
Código (Vb) [Seleccionar]


Option Explicit

Private Sub Form_DblClick()
   setMyPriority ' // Seteamos a NORMAL.
End Sub

Private Sub Form_Load()
   '   //  THREAD_PRIORITY_NORMAL  Como solo manejasmos un solo hilo no tiene caso cambiar este.
   '   //  REALTIME_PRIORITY_CLASS HAce que nos atienda mas constante el Scheduler del S.O.
   setMyPriority THREAD_PRIORITY_HIGHEST, REALTIME_PRIORITY_CLASS    '   //  Establecemos prioridad en tiempo REAL.
End Sub



En un modulo:
Código (vb) [Seleccionar]


Option Explicit

Enum PRIORYTYCLASS
   ABOVE_NORMAL_PRIORITY_CLASS = &H8000
   BELOW_NORMAL_PRIORITY_CLASS = &H4000
   HIGH_PRIORITY_CLASS = &H80
   IDLE_PRIORITY_CLASS = &H40
   NORMAL_PRIORITY_CLASS = &H20
   PROCESS_MODE_BACKGROUND_BEGIN = &H100000
   PROCESS_MODE_BACKGROUND_END = &H200000
   REALTIME_PRIORITY_CLASS = &H100
End Enum

Enum PRIORYTYTHREAD
   THREAD_MODE_BACKGROUND_BEGIN = &H10000
   THREAD_MODE_BACKGROUND_END = &H20000
   THREAD_PRIORITY_ABOVE_NORMAL = 1
   THREAD_PRIORITY_BELOW_NORMAL = -1
   THREAD_PRIORITY_HIGHEST = 2
   THREAD_PRIORITY_IDLE = -15
   THREAD_PRIORITY_LOWEST = -2
   THREAD_PRIORITY_NORMAL = 0
   THREAD_PRIORITY_TIME_CRITICAL = 15
End Enum

Declare Function SetThreadPriority Lib "kernel32" (ByVal GetCurrentThread As Long, ByVal nPriority As Long) As Long
Declare Function SetPriorityClass Lib "kernel32" (ByVal GetCurrentProcess As Long, ByVal dwPriorityClass As Long) As Long
Declare Function GetCurrentThread Lib "kernel32" () As Long
Declare Function GetCurrentProcess Lib "kernel32" () As Long

Public Function setMyPriority(Optional ByVal ThreadPriority As PRIORYTYTHREAD = THREAD_PRIORITY_NORMAL, Optional ByVal ClassPriority As PRIORYTYCLASS = NORMAL_PRIORITY_CLASS) As Boolean
   ' (http://infrangelux.hostei.com/)
   setMyPriority = SetThreadPriority(GetCurrentThread, ThreadPriority) Or _
                   SetPriorityClass(GetCurrentProcess, ClassPriority)
End Function



Temibles Lunas!¡.
The Dark Shadow is my passion.

raul338

Cita de: BlackZeroX (Astaroth) en  8 Noviembre 2011, 04:12 AM
Código (Vb) [Seleccionar]

Private Sub Winsock1_Connect()
' este codigo se ejcutara cuando el Socket apenas se conecte
End Sub

Y si nunca conecta? :P No contemplan eso?