Saludos,
Bueno en estas ultimas semanas vengo programando un projectito de vb6 que incluye un filemanager ( ya saben..lo tipico listar ejecutar subir descargar..)
Primero empece con el winsock, y bueno entre la dependencia del ocx y el 'memory leak' que te obliga a usar DoEvents, pues me decidi a cambiarlo por CSocketMaster, y este ultimo lo cambie en ultima instancia por CSocketPlus, ya que queria poder crear varias conexiones, un canal para la comunicacion simple, y otro para la transferencia de ficheros (al estilo que funcionan los programas ftp)
pero claro estoy teniendo algunos inconvenientes a la hora de la transferencia del archivo, la forma en que lo envio en si funciona,
pero los 2 problemas son que durante la transferencia la CPU se pone al 100%
y la RAM sube un total de la memoria que ocupa la aplicacion + el espacio de la aplicacion cargada en memoria.
Bueno esto ultimo lo solucione con un "ERASE buffer" obviamente para limpiar todo lo que cargo en memoria del file.
Pero en cuanto a lo de la carga del CPU tengo bastantes dudas.
Supongo que lo que deberia de hacer es partir el buffer en X bytes y montar un bucle cierto?
Si es asi calculo que lo mejor seria leer X longitud de bytes del archivo, ademas asi evito que se cargue todo el tamaño del file en memoria, renovando los bytes a cada vuelta.
Asi es como lo hago actualmente para que se hagan una idea.
Private Sub WS_DataArrival(ByVal Index As Variant, ByVal bytesTotal As Long)
·
·
·
// Recibiriamos la cadena "bajar|archivo"
on case "bajar"
indice = indice + 1
canal_envio = indice
filename = Dir1.path & "\" & data(1)
ws.ArrayAdd canal_envio
// Leemos el file
ReDim buffer_file(FileLen(filename) - 1)
Open filename For Binary As 1
Get #1, 1, buffer_file
Close #1
ws.CloseSck canal_envio
ws.Connect canal_envio, ws.RemoteHostIP(Index), ws.RemotePort(Index)
Private Sub ws_Connect(ByVal Index As Variant)
If Index = canal_envio Then
ws.SendData Index, "comienzo|" & filename
ws.SendData Index, buffer_file
sent = True
Erase buffer_file
End If
End Sub
Private Sub ws_SendComplete(ByVal Index As Variant)
If Index = canal_envio And sent = True Then
ws.CloseSck (canal_envio)
canal_envio = -1
sent = False
End If
End Sub
Bueno este metodo tiene el principal inconveniente (aparte de los ya comentados anteriormente) de que solo admite una transferencia y si kieres descargar otro tendras q esperar a q acabe el primero una verdadera mamonada precisamente porque implemente CSocketPlus para poder realizar transferencias simultaneas..
Bueno espero me puedan ayudar, mediante consejos esquemas y demas para lograr todo esto, ya saben.. reducir el uso de la CPU e implementar una funcion de descarga en condiciones ya que llevo atascado aqui un par de semanas ya..
Gracias.