Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: IvanUgu en 17 Noviembre 2008, 14:39 pm



Título: Necesito ayuda...
Publicado por: IvanUgu en 17 Noviembre 2008, 14:39 pm
hola a todos necesito ayuda con lo siguiente

Estoy haciendo un programa que necesita repetir una misma instruccion con un retardo minimo, tal que el control timer no me sirve.
El codigo que estoy usando en este momento no me convence del todo

Código:
 For TT = 1 To VARIABLE
    For T = 1 To 10000: Next T
Next TT

Este codigo tiene la contra de aumentar conciderablemente el uso del CPU.
Por lo tanto cuando necesito mayor retardo es cuando mas esta exigido, y tendria que estar menos exigido en realidad. El programa se vuelve muy inestable, aveces aparece como (No responde) y luego retoma...

Ya probe pon el control Sleep y tampoco me dio resultado...

Agradeceria mucho que me ayuden con esto, ya que al no tener un codigo claro para este motivo me afecta el funcionamiento de todo el programa...

Saludos IvanUgu


Título: Re: Necesito ayuda...
Publicado por: [||HackerDark||] en 17 Noviembre 2008, 14:49 pm
Citar
Ya probe pon el control Sleep y tampoco me dio resultado...

esta seguro de que lo probaste bien el sleep por que yo uso sleep especialmente para retardos ::)
describe que pasa con el sleep





Título: Re: Necesito ayuda...
Publicado por: Angeldj27 en 17 Noviembre 2008, 15:05 pm
Usa el DoEvents...

Saludos...


Título: Re: Necesito ayuda...
Publicado por: IvanUgu en 17 Noviembre 2008, 18:06 pm
Gracias por responder... ahora voy a probar bien con el Sleep y despues les cuento como me fue


Título: Re: Necesito ayuda...
Publicado por: Zeroql en 17 Noviembre 2008, 18:19 pm
si no te da con el sleep prueba con static timer del control timer


Título: Re: Necesito ayuda...
Publicado por: vivachapas en 17 Noviembre 2008, 19:37 pm
puedes usar:
un timer
un bucle
Sleep
GetTickCount

:P


Título: Re: Necesito ayuda...
Publicado por: Dessa en 17 Noviembre 2008, 19:51 pm
Se puede hacer una pausa inferior a 16 milisegundos ???

Código:

Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Form_Load()

Timer1.Interval = 100
Command1.Caption = "GetTickCount"
Command2.Caption = "Sleep"

End Sub

Private Sub Form_DblClick()

Me.Cls

End Sub

Private Sub Command1_Click()

Me.Print GetTickCount
x = GetTickCount: While GetTickCount < x + 15: DoEvents: Wend
Me.Print GetTickCount

End Sub


Private Sub Command2_Click()

Me.Print GetTickCount
Sleep (1)
Me.Print GetTickCount

End Sub




Título: Re: Necesito ayuda...
Publicado por: vivachapas en 17 Noviembre 2008, 20:57 pm
mmm si(?)

modificando ese codigo q pusiste... el del gettickcount xD

no lo viste mucho no?


Título: Re: Necesito ayuda...
Publicado por: Dessa en 17 Noviembre 2008, 21:45 pm
1 y 15 me da lo mismo , no puedo bajar los 16 milisegundos

Private Sub Command1_Click()

Me.Print GetTickCount
x = GetTickCount: While GetTickCount < x + 15: DoEvents: Wend
Me.Print GetTickCount

Me.Print GetTickCount
x = GetTickCount: While GetTickCount < x + 1: DoEvents: Wend
Me.Print GetTickCount

End Sub

No pobraste mucho no ???


Título: Re: Necesito ayuda...
Publicado por: vivachapas en 17 Noviembre 2008, 22:16 pm
a mi no me dio lo mismo cuando lo probe :S
dependera de la velocidad del procesador de tu computadora...


Título: Re: Necesito ayuda...
Publicado por: Dessa en 17 Noviembre 2008, 22:22 pm
Probé con un celeron D 2.4, ahora voy a prubar con un PIII y un Dual Core. 


Título: Re: Necesito ayuda...
Publicado por: IvanUgu en 17 Noviembre 2008, 22:26 pm
yo tambien tengo ese problema mira el code

Código:
Private Sub Command2_Click()
Secuencia:
If Me.Caption <> 100 Then
    Me.Caption = Me.Caption + 1
   
    Sleep (0.5)
   
    GoTo Secuencia
End If
End Sub

si cambio el Sleep (0.6) ya va muchisimo mas lento, pruevenlo...

Código:
Private Sub Command2_Click()
Secuencia:
If Me.Caption <> 100 Then
    Me.Caption = Me.Caption + 1
   
    Sleep (0.6)
   
    GoTo Secuencia
End If
End Sub

Lo que necesito es dar pocos milisegundos y con Sleep me parece que no se puede...


Título: Re: Necesito ayuda...
Publicado por: cobein en 17 Noviembre 2008, 22:32 pm
QueryPerformanceCounter


Título: Re: Necesito ayuda...
Publicado por: Dessa en 17 Noviembre 2008, 22:36 pm
Probé con un dual core E-5200 y lo mismo, no lo pude bajar, no creo que sea problema de micro, voy a probar con tu code IvanUgu y con el de Cobein. Saludos


Título: Re: Necesito ayuda...
Publicado por: Dessa en 17 Noviembre 2008, 23:33 pm
Tampoco puedo con QueryPerformanceCounter (es 0 o 16 Milisegundos)

Código:

Private Type LARGE_INTEGER
    LowPart As Long
    HighPart As Long
End Type
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command1_Click()
    'KPD-Team 2001
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net


 Me.Print GetTickCount

    Dim T As Long, liFrequency As LARGE_INTEGER, liStart As LARGE_INTEGER, liStop As LARGE_INTEGER
    Dim cuFrequency As Currency, cuStart As Currency, cuStop As Currency
    'Retrieve the frequency of the performance counter
    If QueryPerformanceFrequency(liFrequency) = 0 Then
        MsgBox "Your hardware doesn't support a high-resolution performance counter!", vbInformation
    Else
        'convert the large integer to currency
        cuFrequency = LargeIntToCurrency(liFrequency)
        'retrieve tick count
        QueryPerformanceCounter liStart
        'do something
        '*****************************************************
        '*****************************************************
        '*****************************************************
        '*****************************************************
        '*****************************************************
        For T = 0 To 20000
        'For T = 0 To 100000
            DoEvents
        Next T
        '*****************************************************
        '*****************************************************
        '*****************************************************
        '*****************************************************
        '*****************************************************
     
       
        'retrieve tick count
        QueryPerformanceCounter liStop
        'convert large integers to currency's
        cuStart = LargeIntToCurrency(liStart)
        cuStop = LargeIntToCurrency(liStop)
        'calculate how many seconds passed, and show the result
        Me.Print CStr((cuStop - cuStart) / cuFrequency)

Me.Print GetTickCount

    End If

End Sub

Private Function LargeIntToCurrency(liInput As LARGE_INTEGER) As Currency
    'copy 8 bytes from the large integer to an ampty currency
    CopyMemory LargeIntToCurrency, liInput, LenB(liInput)
    'adjust it
    LargeIntToCurrency = LargeIntToCurrency * 10000
End Function

Private Sub Form_Paint()

    'KPD-Team 2001
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Me.Print GetTickCount

    Dim T As Long, liFrequency As LARGE_INTEGER, liStart As LARGE_INTEGER, liStop As LARGE_INTEGER
    Dim cuFrequency As Currency, cuStart As Currency, cuStop As Currency
    'Retrieve the frequency of the performance counter
    If QueryPerformanceFrequency(liFrequency) = 0 Then
        MsgBox "Your hardware doesn't support a high-resolution performance counter!", vbInformation
    Else
        'convert the large integer to currency
        cuFrequency = LargeIntToCurrency(liFrequency)
        'retrieve tick count
        QueryPerformanceCounter liStart
        'do something
        '*****************************************************
        '*****************************************************
        '*****************************************************
        '*****************************************************
        '*****************************************************
        For T = 0 To 20000
        'For T = 0 To 100000
            DoEvents
        Next T
        '*****************************************************
        '*****************************************************
        '*****************************************************
        '*****************************************************
        '*****************************************************
     
       
        'retrieve tick count
        QueryPerformanceCounter liStop
        'convert large integers to currency's
        cuStart = LargeIntToCurrency(liStart)
        cuStop = LargeIntToCurrency(liStop)
        'calculate how many seconds passed, and show the result
        Me.Print CStr((cuStop - cuStart) / cuFrequency)

Me.Print GetTickCount

End If


End Sub



Tal vez con una "ayudita" de Cobein resultaría



Título: Re: Necesito ayuda...
Publicado por: IvanUgu en 18 Noviembre 2008, 02:12 am
A mi me pasa lo mismo no puedo hacer menos de 16ms  :xD