Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Timerlux en 7 Julio 2007, 20:30 pm



Título: Pregunta para Super Guru o tal vez no
Publicado por: Timerlux en 7 Julio 2007, 20:30 pm
Hola !!!

Pues bien he hecho un sistema de captura de pantalla bastante rapido, el problema es que en la aplicacion servidor se dispara el uso de CPU al 100%,
y eso no me gusta nada, hay alguna manera de limitar el uso de CPU para una aplicacion de Visual Basic, estaria mejor que estubiera al 80% por ejemplo.

Alguien me da una respuesta? gracias


Un saludo  :rolleyes: :rolleyes: :rolleyes:



Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: sch3m4 en 7 Julio 2007, 20:35 pm
mejor que limitar el uso de cpu, revisa el código de tu programa, y optimízalo  ;)


Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: BenRu en 7 Julio 2007, 20:52 pm
Claro que te ha salido rápido, no es para menos.  :xD
Si usas el 100% de la cpu, todas las prioridades van para la ejecucion de ese software, dejando de lado otras cosas, con posible bloqueo del pc.

Haz lo que dice Lympex.


Un saludo


Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: Tughack en 7 Julio 2007, 20:58 pm
Para super guru? xD

Pues no hay nada k saber.... so hay una forma buena de hacer eso, ahora se ocupa o no mucho cpu eso ya depende de tu pc...

Hay k para cada imagen k el server envia al client, esperar (en el server) k el client responda al server dejindo k esta listo para recibir otra. Seria algo como:

- Client pide captura de pantalla
- Server recibe la orden
- Server envia la imagen y espera la respuesta del server (aki ya lo tendras k hacer tu)...
- Client recibe la imagen y la carga
- Client pide nuevamente captura de pantalla
....

Solo no uses timers...

Salu2


Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: Hendrix en 7 Julio 2007, 21:00 pm
Si lo que estas aplicando tu es un bucle que capture frames peus asi es normal que consuma mucho CPU, si estas utilizando un bucle, intercala en ese bucle la instrucción DoEvents, para que no consuma tanta CPU

Un Saludo.  ;)



Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: [VolkS] en 7 Julio 2007, 21:29 pm
estas usando el modulo cJpg o algo asi y ese modulo a micros con menos de 500mhz anda mal


Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: Tughack en 7 Julio 2007, 23:26 pm
Si lo que estas aplicando tu es un bucle que capture frames peus asi es normal que consuma mucho CPU, si estas utilizando un bucle, intercala en ese bucle la instrucción DoEvents, para que no consuma tanta CPU

Un Saludo.  ;)



Si eso es importante! Kualkier bucle largo k no tenga un DoEvents se lia y la aplicacion no responde.

Do
    DoEvents
    'codigo
Loop

o

For i = 0 to 5000
    DoEvents
    'codigo
Next i

Salu2


Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: Timerlux en 7 Julio 2007, 23:50 pm
Bueno he de decir que: 

Acabo de terminar un sencillo proyecto para pruebas sobre esta idea y es la primera prueba que hago, supongo que se podra mejorar, hay es donde quiero que me aconsejeis.
La question es esa, se puede Optimizar sin perder velocidad o no mucha y rebajar uso CPU.

Lo he probado en Local con lo que mi PC hace las veces de Cliente y Servidor, aunque no creo que haciendo solo de servidor se reduzca el uso de CPU.

Lympex:
Citar
mejor que limitar el uso de cpu, revisa el código de tu programa, y optimízalo

Esa es la question , se podra optimizar sin perder velocidad, si lo optimizo para que me mande un fotograma por segundo o dos, pues ya no tiene gracia.



Hendrix:
Citar
Si lo que estas aplicando tu es un bucle que capture frames peus asi es normal que consuma mucho CPU, si estas utilizando un bucle, intercala en ese bucle la instrucción DoEvents, para que no consuma tanta CPU

Si Hendrix, era la primera prueba y no me he complicado, le he puesto un DO,DoEvents,LOOP simplemente para ver si me funcionaba, y funciono entre ""

Lo que dice Tughack me da buena espina, en un pricipio pensaba que tendria que hacerlo asi para que funcionara, pero funciono sin que el cliente confirmara la imagen recibida, me sorprendi de que funcionara sin esto, pense que se produciria un Caos y un Desfase entre cliente y servidor. tal vez haciendo esto  y quitando el DO LOOP consiga algo.

Un esquema:
----------------------
SERVER:
1 Captura de pantalla
2 GetDiBits - crea "Array de Bytes" con la informacion de la imagen
3 Comprime Array
4 Extrae Trozo y Envia,  Extrae Trozo y Envia,  Extrae Trozo y Envia ..............

CLIENT:
1 Va juntando,  Va juntando, Va juntando .................
2 Descomprime Array
3 SetDiBits - Muestra la imagen

Bueno ya os contare, y si teneis mas sugerencias !!!


 :D :D  ::) :D :D




Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: Timerlux en 8 Julio 2007, 00:11 am
Otro esquemilla:

Do While Parar = False
   BitBlt Pic1.hdc, 0, 0, Screen.Width, Screen.Height, DK_DC, 0, 0, vbSrcCopy
   Pic1.Refresh
   MyGetDIBits     '-----Procedimiento que crea el Array
   DoEvents
Loop

Private Sub MyGetDIBits()
  Bla, Bla,Bla
  CompressByteArray  XArray  '-----------Aqui se llama para comprimir el Array
  EnviaByteArray XArray          '-----Procedimiento que parte y Envia
End Sub


Private Sub EnviaByteArray()
Bla,Bla, Bla     '------Se envia
End Sub


Voy a probar a meter DoEvents por todas partes por que ademas hay otro pequeño fallo en elcual cada 1 o 2 segundos aveces me llega 1 fotograma defectuoso , como si le faltara un color al televisor, se ve o rojizo o verdoso y eso es porque el Byte Array no se recompone corretamente  y le faltan algunos datos y estoy casi seguro que es porque va a toda ostia (1 fotograma cada 60 milisegundos  o 200 milisegundos en el peor de los casos "Medido en Local") y no le da tiempo a hacer todos los pasos  que tiene correctamente, si pongo DoEvents por todas partes para que termine cada paso a lo mejor lo soluciono, o si hago lo de que el cliente confirme la receppcion tambien


Saludos !!!!!







Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: Tughack en 8 Julio 2007, 00:31 am
Aver, no olvides k los estas probando localmente. Remotamente necesitas un metodo de seguridad para garantir k se recibe y esta listo para recibir nuevamente. Sino se lia todo.

Salu2


Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: sch3m4 en 8 Julio 2007, 11:46 am
si lo que quieres es hacer un programa para ver la pantalla remota en tiempo real, no se hace así. Tienes que hacer una primera captura, alojarla en el pc remoto y enviarla al cliente, y periodicamente guardar en el servidor otra captura de pantalla, y contrastar los dos archivos en busca de bytes diferentes, en lo que realmente es la imagen, y enviarle esos bytes al cliente, junto con la posición en la que deberían estar.


Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: Timerlux en 8 Julio 2007, 16:25 pm
Si señor ,no se me habia ocurrido, asi los datos por cada fotograma a enviar son muchisimo menores.

Lympex me puedes decir de donde sabes tu eso, conoces algun Link, Manual, Codigo o algo.

Me gustaria saber como de forma simple y limpia, Comparando 2 Byte Array, le mando informacion al cliente de los "Bytes Cambiados" y la "Posicion", a primera vista se me ocurre un Array de 2 dimensiones, pero eso ya no me gusta y se me podria complicar el tema .

Gracias Lympex  ;D ;D ;D


Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: Hendrix en 8 Julio 2007, 17:13 pm
Eso de tansmitir datos por comparación es lo ideal...pero esto no sirve para fotogramas capturados de la web cam, pues habrá muy pocos pixels que coincidan.



Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: Timerlux en 8 Julio 2007, 17:33 pm
Hendrix se puede hacer de forma cutre, si cojes el array de bytes del bitmap con 4 bits (16 colores) u 8 (256) bits de definicion ,si te coinciden muchisimos pixel pero pierdes mucha calidad.

Con "color real" 24 , 32 bits el minimo e inapreciable cabio de luz , cambia todos los pixels, nigun fotograma es igual al anterior aunque lo parezca, te lo digo por experiencia


Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: Hendrix en 8 Julio 2007, 17:37 pm
Ya lo se, por eso te digo que con webcam no funciona eso... ;) ;)


Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: sch3m4 en 9 Julio 2007, 15:30 pm
para la webcam también serviría, lo que ocurre es que no puedes hacer la comparación literalmente, tendrías que cojer grupos de bytes, y mirar el porcentaje de bytes que son iguales/diferentes, y ajustarlo a tu gusto.

Timerlux, lo sé porque no eres el primero ni el último que necesita optimizar código ;)

No es algo muy complejo, pero debes tener en cuenta, que no puedes comparar el archivo completo, debes empezar a comparar después de la cabecera y el pie del archivo.

Mirate la estructura del archivo de imagen que guardas, mira cuánto ocupa la cabecera, etc. Y evalúa el resto del archivo.

Después unicamente cojes el byte que quieras enviar, y lo envías junto con la posición en la que se encuentra en tu archivo, pero asegurate, de que el tipo del fichero es igual en el cliente que en el servidor.


Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: Timerlux en 9 Julio 2007, 16:55 pm
La historia es que yo no uso ningun archivo, me ahorro ese paso.

Ni si quiera uso una Picturebox en el servidor para contener la imagen capturada, en su lugar uso las APIS  "CreateCompatibleDC", "CreateCompatibleBitmap".

No obtengo el "Byte Array" de un archivo previamente guardado, lo obtengo directamente de la imagen capturada.

El dilema ahora es que para usar el metodo de comparar cambios en imagenes , necesito comparar diferencias entre 2 "Byte arrays" y me tarda mucho Milisegundos entre (100 y 400), parece mentira pero puede que me no compense hacer comparaciones, si bien en la velocidad de transmision de datos ganare mucho, en el procesamiento de la imagenes perdere mucho, necesito encontrar un codigo rapido que haga las comparaciones arrays y me de otro array con los cambios, ahora estoy con eso solo he encontrado un codigo que me puede resolver la papeleta pero tengo que depurarlo y entenderlo muy bien.

Saludos  ;D ;D ;D



Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: Timerlux en 9 Julio 2007, 17:07 pm
Citar
Después unicamente cojes el byte que quieras enviar, y lo envías junto con la posición en la que se encuentra en tu archivo

Esa es otra cosa que todavía no se como sera la mejor manera de Hacerlo

- Un array de 2 dimensiones?
  Cambios(posicion, byte)
  que tal se llevan los arrays de 2 dimensiones con Winsock?

- Un array de string
  Cambios("23#45") 

Teniendo en cuenta que la mi prioridad es la rapidez, no se que hacer

 ;D ;D


Título: Re: Pregunta para Super Guru o tal vez no
Publicado por: sch3m4 en 9 Julio 2007, 23:24 pm
no te digo que uses picture box, realmente en este caso te sirve para poco en el lado del servidor, lo que te digo, es que guardes la primera captura, y esa la envias completa, y la visualizas en el cliente.

Luego, puedes usar un timer, e ir realizando capturas y guardandolas en otro archivo, y comparas ese nuevo archivo con el anterior, y envías las diferencias. Después de hacer esto, reemplazas el archivo antiguo, por el nuevo, y vuelves a realizar la captura y guardarla.

Yo usaría una string.