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 :)
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
para contestarte bien a tu pregunta.
en lugar de sleep algo "parecido" es
DoEvents
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.
.
Es mejor que uses el evento:
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!¡.
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
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 (https://secure.wikimedia.org/wikipedia/es/wiki/Planificador). 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!¡.
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:
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:
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!¡.
Cita de: BlackZeroX (Astaroth) en 8 Noviembre 2011, 04:12 AM
Private Sub Winsock1_Connect()
' este codigo se ejcutara cuando el Socket apenas se conecte
End Sub
Y si nunca conecta? :P No contemplan eso?