Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - BlackZeroX

#1331
.

Antes queda estas tecnicas que te menciono las he aplicado en mi ListViewEX... a lo mejor te sirva ( ListViewEx 2.0 ).


Seria mopdificando esta funcion para que trabajara con un vector a la estructura del tipo:

Código (vb) [Seleccionar]


type stRelacion
    lIndexSock as long
    lIndexListView as long
end type



en el código de la función (el del enlace) modificas el vaBuff() as long  por vaBuff as stRelacion y en las comparaciones donde aparece vaBuff pones la variable de la estructura stRelacion a buscar de manera rapida.

algo asi:

antes:
Código (Vb) [Seleccionar]


private function ExitsInArray (byval lvaltofind as long,byref vaBuff() as long,byref lPos as long) as boolean
   '....algo de código
   if lvaltofind= vabuff(indice) then
     '...algo de código
   end if
end function



lo suplantas por algo similar a esto...

Código (Vb,9,2,3,4,5) [Seleccionar]


type stRelacion
    lIndexSock as long
    lIndexListView as long
end type

private function ExitsInArray (byval lvaltofind as long,byref vaBuff() as stRelacion,byref lPos as long) as boolean
   '....algo de código
   if lvaltofind= vabuff(indice).lIndexSock then
     '...algo de código
   end if
end function



Ahora para hacer o estar creando dicha relación debes llenar cada elemento del vector donde guardaras la relación en IndiceSocket-IndiceFilaListView en el evento donde haces el AceptRequest del Socket.

algo asi:

Código (Vb) [Seleccionar]


private vaRelacion() as stRelacion

private sub algunproceso(byval index as long,... otros parametros del proceso o evento)
Dim lpos as long
Dim lub as long
Dim lIndexRow as long
    '... Antes aceptas la conexion en este mismo proceso
    lIndexRow = '...Agregas un registro mas al listview y obtienes su indice ( propiedad count y le resta 1 para obtener el indice de la fila...) )
    if ( ExitsInArray(index, vaRelacion, lpos) )  'buscamos si ya hay alguna relacion....
        '// Ya hay una relacion pero como dicha relacion no esta en el listview actualmente o esta en desuso... solo la modificamos
        vaRelacion(lpos).lIndexListView = index ' // como ya existia solo le actualisamos el registro al listview...
    else
        ' // si no existe redimensionamos vaRelacion
        if (itsarrayini(varptrarr(vaRelacion))=true) then
            lub = ubound(vaRelacion)+1
            redim preserve vaRelacion (lbound(vaRelacion) to lub)
            vaRelacion(lub).lIndexSock = index
            vaRelacion(lub).lIndexListView = lIndexRow
        end if
    end if
end sub



Con eso se llena... ahora que si quieres quitar dicha relacion. solo seria modificando esta funcion de la misma manera:

Código (Vb) [Seleccionar]


Private Function privRowDelete(ByRef vRowIndex As Long) As Boolean
Dim ln_Bytes                                As Long
Dim lng_PtrOld()                            As Byte
    With PCVars.Rows
        If .Count > 0 Then
            ln_Bytes = LenB(.Row(0))
            .Count = .Count - 1
            If .Count > 0 And vRowIndex > InvalidValueArray Then
                If ln_Bytes > 0 And vRowIndex + 1 <= .Count Then
                    ReDim lng_PtrOld(1 To ln_Bytes)
                    Call CopyMemory(ByVal VarPtr(lng_PtrOld(1)), ByVal VarPtr(.Row(vRowIndex)), ln_Bytes)
                    Call CopyMemory(ByVal VarPtr(.Row(vRowIndex)), ByVal VarPtr(.Row(vRowIndex + 1)), ln_Bytes * (.Count - vRowIndex))
                    Call CopyMemory(ByVal VarPtr(.Row(.Count)), ByVal VarPtr(lng_PtrOld(1)), ln_Bytes)
                End If
                ReDim Preserve .Row(0 To .Count - 1)
            Else
                Erase .Row()
            End If
            privRowDelete = True
        End If
    End With
   
End Function





para que entiendas esta funcion has de cuenta que un array vector o matrix es una sucesion de valores uno atras de otro o uno delante de otro como la numeros:

0123456789

Ok bien el trabajo de copymemory es copiar bloques de ellos a otras partes es decir digamos que tenemos esto en la memoria...

aaaabbbbccccddddeeeeffff

ok? en la memoria un puntero es de 4 bytes (en arquitecturas de 32 bits vb es de 32 bits), bien lo que se hace es que la dirrecion fisica de un puntero indica donde esta algo lo que sea...

ahora par LenB() obtiene el peso en bytes de un indice de un elemento de un array o vector... despues se multiplica por la cantidad de elementos a deszplazar.. digamos ahora si:

aaaabbbbccccddddeeeeffff

Como vez puse de alguna manera 4 a, 4 b 4c etc... por que digamos que son punteros ( 4 bytes = long = puntero ) funcion VarptrArr().

Cada 4 bytes = 1 elemento del indice de un vector/array por lo tanto lenb(vaRelacion(indice)) = 4 u 8 bytes ( puede variar aun que si hay punteros o declaracion de strings o mas arrays no inicializado dentro de la estructura es comun que sean 4 bytes de lo contrario en este caso como son todos long te dara 8 bytes cada elemento de vaRelacion(indice)... )

Ok llendo al grano de esto lenb(vaRealacion(indice)) = 8 por lo tanto de:

aaaabbbbccccddddeeeeffff

"aaaabbbb" se decuce que que como esta la estructura en la 1ra variable es lIndexSock las "aaaa" indican este valor y las "bbbb" indicaran lIndexListView el trabajo del codigo es que si quieres remover por ejemplo el indice 1 de vaRelacion ( es decir "ccccdddd" ) se hace esto:

Se hace un backup de "ccccdddd" en un array de Bytes(0 to (lenb(vaRelacion(indice))-1)) o bien (0 to 7) como ya habíamos analisado...

lng_PtrOld = {"ccccdddd"} ' 1er copymemory

se mueve el bloque hacia la izquierda....

aaaabbbbeeeeffffeeeefffff ' 2do copymemory

como vez ahora se repitieron "eeeeffff" pero como somos organisados y queremos que nuestro proceso sea maleable y adaptable para otros aspectos que quisas nos sirvan en un futuro hacemos que lo guardado en el array de bytes (en este caso lng_PtrOld) lo mandamos al final...
Hacemos un 3er copymemory para mandar lo resguardado al final quedando

quedando:

aaaabbbbeeeeffffccccdddd ' // 3er copymemory

al final aplicamos un redim preserve para eliminar ahora si el ultimo indice y quedaria haci...

aaaabbbbeeeeffff

De esta manera se eliminara un elemento de un array/vector cualquiera de manera veloz es la mas veloz que existe en vb6

en si solo se nesesitaria 1 copymoemy para este caso pero quise explicarte el por que de 3 copymemory... ya que si es otra estructura puede que cada indice el puntero sea un puntero al bloque de memoria donde se encuentren las variables pero como no es el caso puedes usar 1 copymemory libremente...



Temibles Lunas!¡.
.
#1332
.
Actualice el código de mi función.

Temibles Lunas!¡.
#1333
.
Así queda mejor (Todo lo demás es solo una expansion...):

Revise nuevamente mi código y vi que no eran necesarias las comparaciones dentro del do-loop de los indices lbound y ubound o las sustituciones, ya que el que importa es el elemento medio.

Código Fuente de prueba (Test Aleatorio)



Código (Vb) [Seleccionar]


Private Sub SwapVals(ByRef lVal1 As Long, ByRef lval2 As Long)
    lval2 = lval2 Xor lVal1
    lVal1 = lVal1 Xor lval2
    lval2 = lval2 Xor lVal1
End Sub

'Return (Devuelve True si existe en el array)
Public Function ExitsInArray(ByRef lFind As Long, ByRef avBuff() As Long, ByRef lpos As Long) As Boolean
Dim llb             As Long
Dim lub             As Long
Dim lposa           As Long
    'If Itsarrayini(VarPtrA(avBuff())) Then
        llb = LBound(avBuff)
        lub = UBound(avBuff)
        If (avBuff(lub) < avBuff(llb)) Then
            SwapVals lub, llb
        End If
        If ((avBuff(llb) <= lFind) And (lFind <= avBuff(lub))) Then
            Select Case lFind
                Case avBuff(lub)
                    lpos = lub
                    ExitsInArray = True
                Case avBuff(llb)
                    lpos = llb
                    ExitsInArray = True
                Case Else
                    lposa = llb
                    Do
                        lpos = (llb + lub) \ 2
                        If (lposa = lpos) Then
                            Exit Do
                        ElseIf (avBuff(lpos) > lFind) Then
                            lub = lpos
                        ElseIf (lFind > avBuff(lpos)) Then
                            lposa = lpos
                            llb = lpos
                        ElseIf (avBuff(lpos) = lFind) Then
                            ExitsInArray = True
                            Exit Do
                        End If
                    Loop
            End Select
        End If
    'End If
End Function



Dulces Lunas!¡.
#1334
acabo de hacer el test de otra manera y resulta que ahora la mia es mas rapida que la tuya...



Private Sub Form_Load()
Dim L&(6000), Q&, t As New CTiming, y&
   
    If App.LogMode = 0 Then End
   
    For Q = 0 To 6000
        L(Q) = Q * 2
    Next Q
   
    Me.AutoRedraw = True
   
        t.Reset
    For Q = 1 To 1000
        ExitsInArrayNR 15, L, y
        ExitsInArrayNR 40, L, y
        ExitsInArrayNR 2001, L, y
        ExitsInArrayNR 5020, L, y
        ExitsInArrayNR 12000, L, y
    Next Q
    Me.Print "ExitsInArrayNR", t.sElapsed
   
    t.Reset
    For Q = 1 To 1000
        IsInArray L, 15
        IsInArray L, 40
        IsInArray L, 2001
        IsInArray L, 5020
        IsInArray L, 12000
    Next Q
    Me.Print "IsInArray", , t.sElapsed
   

End Sub



Dulces Lunas!¡.

#1335
ŞCØRPIØN-X3.

Se te a alentisar demasiado con un simple For Next... digamos que con los primeros 1000 elementos irea rapido pero a medida que se eliminan, agregan etc etc, se alentizara de manera esuberante.

Una pequeña solución es crear una estructura

Código (Vb) [Seleccionar]


type tlvFind
    lindexSrc as long ' // Indica de donde viene
    lindexDest as long ' // Indica a donde pertece
end type



Después creando un vector de la estructura y ordenando de menor a mayor o viceversa, el indice respectivo al Item del listview puedes usar la función ItsInArrayNR modificandola un poco para que busque de manera rapida en donde ubicar la informacion.

Temibles Lunas!¡.
#1336
y si le haces un casting?

(int)

Dulces Lunas!¡.
#1337
.
puedes traducir este codigo:

http://foro.elhacker.net/programacion_visual_basic/src_crndnumbersnr_generar_numeros_aleatorios_sin_repetir_veryfast-t328967.0.html

El algoritmo es súbitamente rápido ya que no emplea bucles en la creación de números aleatorios.

Dulces Lunas!¡.
.
#1338
.
OK, yo pensaba que decias por el array de stRangos (lvcsplit) .

No hagas el test de esa manera,:

estas aplicando la relación:

Variable -> a -> Variable

la debes aplicar

(Miembro de clase)Propiedad -> a -> Variable

La diferencia radica en que en una no hay PILA de datos y en otra si.

Dulces Lunas!¡.
#1339
.
Se me ocurre meterle un juego al bloqueo de pantalla...

Dulces Lunas!¡.
#1340
'
1024*4 = 4096  = 4kb's ---> Cache eso me estas sugiriendo?, aun así la probabilidad de que se ocupe la clase en un bucle tal cual lo hago es baja.

GetNumbers() se puede usar Set también no tengo idea si se aumenta la velocidad...

P.D.: Psyke1 -> Estoy saturado de tarea... lo bueno que ya entro para el ciclo vacacional en 5 días.

Dulces Lunas!¡.