Problema de memoria y CPU al transferir archivos

Iniciado por Isótopo, 9 Noviembre 2009, 21:54 PM

0 Miembros y 1 Visitante están viendo este tema.

Isótopo

Hola. Estoy codeando una aplicacion cliente-servidor y a la hora de subir archivos la memoria que usa el cliente (el que lo manda) llega a 200 megas y CPU 100%. El archivo se manda pero se colapsa y no me muestra ni las barras de progreso hasta que termina. Aquí tengo el code:


'Declaraciones
Dim progress As Boolean
Dim nombre As String
Dim path As String
Dim strIndex As String
Dim strData As String
Dim filesize As Long
Dim Size As Long
Dim arrData() As Byte
Dim localpath As String

private sub upload_Click()
'al darle click al boton upload
cd.Filter = "Todos los archivos |*.*"
cd.ShowOpen
Open cd.FileName For Binary Access Read As #1
Size = LOF(1)
ReDim arrData(Size - 1)
'mete el archivo en la matriz
Get #1, , arrData
Close
nombre = cd.FileTitle
path = pathupload.Text
path = path + nombre
localpath = cd.FileName
filesize = FileLen(localpath)
csocketplus.SendData Index, "upl" & "|" & filesize & "|" & path

Private Sub csocketplus_DataArrival(ByVal Index As Variant, ByVal bytesTotal As Long)
csocketplus.GetData Index, strData
'si los datos que recibe corresponde a la confirmacion del servidor para la recepcion del archivo, lo envia.
If strData = "okupl" Then
'activa la barra de progreso
progress = True
csocketplus.SendData Index, arrData

Private Sub csocketplus_SendProgress(ByVal Index As Variant, ByVal bytesSent As Long, ByVal bytesRemaining As Long)
If progress = True Then
'prog_sub es la barra de progreso
prog_sub.Min = 0
'filesize es el numero de bytes del archivo
prog_sub.Max = filesize
prog_sub.value = prog_sub.value + bytesSent
prog_sub.Value = bytes
'cuando los bytes del archivo corresponden con el valor de la barra de progreso, se restablece y se vuelve la bandera a false
If filesize = prog_sub.value Then
prog_sub.Value = 0
progress = False
End If
End If
End Sub


No se cual es el problema que hace que el código funcione pero que haga que se colapse. Aver si encontramos la solucion. Muchas gracias.

-Asus Crosshair IV Formula            
-AMD Phenom II X6 1090T 3.94Ghz @1.38V
-Corsair H70
-Sapphire Radeon HD 6970 2GB Dual-Fan
-G.Skill PIS PC3-17066 4GB 1900MHz 7-9-7-20 @1.65V
-WD Caviar Black 500GB
-Seagate Barracuda Green 2TB x2
-Antec TruePower New 750W Modular
-Cooler Master Dominator CM-690

BlackZeroX

#1
Por favor usa Geshi y da tabulaciones/indecta tu codigo que no se entiende a simple vista nada ademas de verse Mal hecho sin estarlo o tal vez si....

es obvio lo que haces es cargar a lo bruto un archivo en la memoria

Size = LOF(1)
ReDim arrData(Size - 1)

esa variable toma en un peso identico al que ocupa el archivo dado en el hd, lo que puedes hacer es cortar y mandar por tramos dicho archivo ( es decir simular un corte de un archivo dependiendo los bytes deseados en memoria ) y posteriormente mandar ese tramo, al termino cargar otro tramo/pedazo y mandarlo, ( yo habitualmente solo cargo de una rchivo de 1 giga por decir algo solo 255 kbytes a 1 mega en una vaiable y asi los mando de esta forma la memoria no se ve tan incrementada mas de lo que he dicho )



Edito usa una regla de 3 para calcular el proceso en el Progressbar o de lo contrario le crearas un overflow


P.d.: Apoco no te da errores el no cerrar los procesos:  

private sub upload_Click() y csocketplus_DataArrival



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

danicasasm

prog_sub.Min yprog_sub.Max sólo deberian modificarse al principio y al final, no cada vez que madifiques el valor.
Para ver la barra de progreso deberias poner DoEvents cada vez que actualizas su valor, si el ordenador va muy saturado no actualiza la barra con suficiente frecuencia.
Doevens permite al windows atender otras tareas a parte del programa, por lo que es muy útil en tareas largas o dentro de bucles.

BlackZeroX

esto es algo curioso y a la vez tonto, pero yo antes igual lo hacia asi que bueno:

prog_sub.value = prog_sub.value + bytesSent
prog_sub.Value = bytes

no tiene caso...

dulces lunas!¡.
The Dark Shadow is my passion.

Isótopo

Si...estoy empezando y tengo muchos fallos de subnormal pero esque ademas el codigo no lo copie tal cual lo tengo sino que le puse algunas cosas que no venian a cuento para intentar que se entendiera. De todas formas creo que ya he encontrado la solucion en el source del file manager de EON... mil gracias a él y a vosotros por responderme, me habeis sido de gran ayuda si tengo alguna duda que no pueda resolver pregunto. Gracias.

-Asus Crosshair IV Formula            
-AMD Phenom II X6 1090T 3.94Ghz @1.38V
-Corsair H70
-Sapphire Radeon HD 6970 2GB Dual-Fan
-G.Skill PIS PC3-17066 4GB 1900MHz 7-9-7-20 @1.65V
-WD Caviar Black 500GB
-Seagate Barracuda Green 2TB x2
-Antec TruePower New 750W Modular
-Cooler Master Dominator CM-690